Michael Allen Smith
Michael Allen Smith

Reputation: 89

Javascript Async Await Code Execution Order

I'm stumped why loopCafes runs before buildCafeList in this example. I need to build an array and pass it along for additional modification, but the execution order is reversed.

The output returns:

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

Upvotes: 1

Views: 108

Answers (1)

Quentin
Quentin

Reputation: 944147

fs.readdir is an async function that accepts a callback.

Consequently, buildCafeList returns immediately (since you marked it async and didn't include an explicit return statement it returns a promise that resolves immediately).

Later on, the callback for fs.readdir is triggered and the value you are logging is reported.


You need to wrap fx.readdir in a promise and resolve it when you get the data you want in the callback. buildCafeList needs to return that promise.

Upvotes: 2

Related Questions