【问题标题】:saving api call data with multiple calls通过多次调用保存 api 调用数据
【发布时间】:2021-08-17 12:22:44
【问题描述】:

我无法获取变量中的数据,以便在我的代码中使用它。现在,从第二个异步函数 joinData 返回的 Map 登录到控制台,但我无法在我的代码中访问它,我随后通过 console.log 测试该变量。我试过了:

  • joinData().then(d => data = d) 中将其保存为“d”
  • 我也尝试将它复制为同一块中的地图,但当我 console.log 时,我总是得到“未定义”
  • 在调用中将数据保存为joinedData
  • 几乎我能想到的所有组合,但每个组合都会产生undefinedPending <Promise>
    const getWkItems = async function fetchAllReviewStats(
        endpoint = "review_statistics"
    ) {
        let requests = {
            method: "GET",
            headers: { Authorization: "Bearer " + apiToken },
        };
        let results = new Array();
    
        let nextUrl = `https://api.wanikani.com/v2/${endpoint}`;
        while (nextUrl) {
            let resp = await fetch(nextUrl, requests);
            if (resp.ok) {
                let body = await resp.json();
                nextUrl = body.pages.next_url;
                results.push(...body.data);
            } else {
                throw Error(`${resp.status}: ${resp.statusText}`);
            }
        }
        return results;
    };
    
    //get review data
    const joinData = async () => {
        const reviewStats = new Map();
        const getReviewStats = await getWkItems("review_statistics").then((data) => {
            data.forEach((d) => {
                reviewStats.set(d.data.subject_id, {
                    updated_at: d.data_updated_at,
                    ...d.data,
                });
            });
        });
    
        //get map of subjects
        const subjects = new Map();
        const getSubjects = await getWkItems("subjects").then((data) => {
            data.forEach((d) => {
                subjects.set(d.id, {
                    updated_at: d.data_updated_at,
                    slug: d.data.slug,
                    meanings: d.data.meanings,
                    characters: d.data.characters,
                    readings: d.data.readings,
                    level: d.data.level,
                });
            });
        });
        //sort data
        let sortedReviewStats = new Map(
            Array.from(reviewStats.entries()).sort(
                (e1, e2) => Date.parse(e2[1].updated_at) - Date.parse(e1[1].updated_at)
            )
        );
    
        //connect subject to sorted data view
        const joinedData = new Map();
        sortedReviewStats.forEach((d, id) => {
            joinedData.set(id, { ...d, subject: subjects.get(id) }); //this looks up subject by its id
        });
    
        return joinedData;
    };
    joinData().then(d => console.log(d))

【问题讨论】:

  • 我已请求 API_TOKEN 来帮助您,但我没有可“玩”的评论统计信息...我得到的只是我在 new repository 中输入的内容...也许您可以告诉我如何将评论统计数据填充到 wanikani(或创建一个临时 API 令牌并在您满意后删除)以提供更多帮助?
  • 谢谢,我已经用你的新令牌更新了代码,但我没有发现任何问题(更新了自述文件中的输出),我正在使用axios(你提到 NodeJs 是一个标签,并且 axios 比 fetch 后端要好得多),但也许你可以克隆 repo 并运行它自己检查?
  • 我实际上只使用前端。正如答案所建议的,我能够通过在另一个异步函数中调用数据来解决它。我从不使用 vanilla js,通常使用 Svelte 或 React,这总是更直接......感谢您的帮助!如果我需要后端,我肯定会使用 axios - 似乎更容易。

标签: javascript node.js api async-await promise


【解决方案1】:

发生这种情况是因为,您正试图在所有 Promise 解决之前访问结果,请尝试以下操作:

try {
  let results = await joinData();
  console.log(results);
}catch(e){
// error handling here
}

只要确保当前函数也是async,这段代码就在其中。在此之后,无论您何时登录 results,它都不会是 undefined

【讨论】:

  • 谢谢!是的,问题是我试图在异步函数之外访问它。
  • 太好了,我很高兴我的回答很有用。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多