首页 > 解决方案 > 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();

标签: javascriptarraysnode.jsasync-await

解决方案


fs.readdir是一个接受回调的异步函数。

因此,buildCafeList立即返回(因为您标记了它async并且没有包含显式return声明,它返回一个立即解析的承诺)。

稍后,fs.readdir触发回调并报告您正在记录的值。


当您在回调中获得所需的数据时,您需要包装fx.readdir一个承诺并解决它。buildCafeList需要回报那个承诺。


推荐阅读