【发布时间】:2021-08-17 12:22:44
【问题描述】:
我无法获取变量中的数据,以便在我的代码中使用它。现在,从第二个异步函数 joinData 返回的 Map 登录到控制台,但我无法在我的代码中访问它,我随后通过 console.log 测试该变量。我试过了:
- 在
joinData().then(d => data = d)中将其保存为“d” - 我也尝试将它复制为同一块中的地图,但当我
console.log时,我总是得到“未定义” - 在调用中将数据保存为
joinedData - 几乎我能想到的所有组合,但每个组合都会产生
undefined或Pending <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