javascript - Javascript Async Await 代码执行顺序
问题描述
我很困惑为什么在这个例子中loopCafes在buildCafeList之前运行。我需要构建一个数组并将其传递给其他修改,但执行顺序是相反的。
输出返回:
循环咖啡馆:0
获取咖啡列表 8
获取咖啡列表 16
const fs = require("fs");
const JSON_FOLDER = "./reports/";
let cafes = [];
const buildCafeList = async () => {
fs.readdir(JSON_FOLDER, function(err, list) {
if (err) throw err;
list.forEach(function(file) {
let thisJSON = JSON_FOLDER + file;
fs.readFile(thisJSON, function(err2, data) {
if (err2) throw err2;
let thisJSON = JSON.parse(data);
for (let i = 0; i < thisJSON.businesses.length; i++) {
let thisCafe = thisJSON.businesses[i];
cafes.push({
alias: thisCafe.alias,
name: thisCafe.name,
url: thisCafe.url,
address1: thisCafe.location.address1,
city: thisCafe.location.city
});
}
console.log("getCafeList", cafes.length); // 8, 16
});
});
});
};
const loopCafes = async () => {
console.log("loopCafes:", cafes.length); // 0
for (let k = 0; k < cafes.length; k++) {
console.log(k, cafes[k].name);
}
};
const buildReport = async () => {
const getCafeList = await buildCafeList();
const showCafeList = await loopCafes();
};
buildReport();
解决方案
fs.readdir
是一个接受回调的异步函数。
因此,buildCafeList
立即返回(因为您标记了它async
并且没有包含显式return
声明,它返回一个立即解析的承诺)。
稍后,fs.readdir
触发回调并报告您正在记录的值。
当您在回调中获得所需的数据时,您需要包装fx.readdir
一个承诺并解决它。buildCafeList
需要回报那个承诺。
推荐阅读
- asp.net-core - IIS / Server 2019 上的 Blazor 静态文件 404 错误,但不是 IIS Express / Win10
- android - 在 Android 中的 ConstraintLayout 底部设置约束
- python - 将 pandas 列转换为单个列表
- typescript - 如何从打字稿函数返回多个值
- amazon-web-services - AWS EMR - Hue 在哪个端口上工作?
- java - 尝试从通过 java Process 执行的 shell 脚本保存文件时,文件始终为空
- c - 如何从使用 ctypes 在 python 中由 MSVC 编译的 dll 调用函数?
- c - 如何修复仅在 MacOS High Sierra (10.13.6) 上出现的 malloc 错误?
- c# - NLog 从我的机器写入所有目标,但无法写入应用服务器上的数据库目标
- python - SQL Server Management Studio v18.6 中的 Python/R