【问题标题】:Javascript Async Await Code Execution OrderJavascript Async Await 代码执行顺序
【发布时间】:2018-12-15 13:12:44
【问题描述】:

我很困惑为什么在这个例子中 loopCafesbuildCafeList 之前运行。我需要构建一个数组并将其传递给其他修改,但执行顺序是相反的。

输出返回:

loopCafes:0

getCafeList 8

getCafeList 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();

【问题讨论】:

    标签: javascript arrays node.js async-await


    【解决方案1】:

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

    因此,buildCafeList 立即返回(因为您将其标记为 async 并且没有包含明确的 return 语句,它返回一个立即解决的承诺)。

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


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

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 2021-09-30
      • 2020-04-13
      • 2018-06-25
      • 2019-07-01
      • 2020-08-16
      • 2021-01-27
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多