簡體   English   中英

當foreach以javascript結束時如何執行代碼

[英]How to execute code when foreach ends in javascript

當下面的代碼運行時,我希望 score 有一個值(可以說:{“A”:1,“B”:2}),但是當我打印它時,我得到一個空字典({})。

我曾嘗試使用承諾,但結果是一樣的。

driversBySeason(season) {
    var query = `SELECT raceId FROM races WHERE year = ${season}`;
    var score = {};

    this.con.query(query, (err, drop) => {
      if (err) {
        console.error(err);
      }

      drop.forEach((element) => {
        var raceId = element["raceId"];

        query = `SELECT driverId, points FROM results WHERE raceId = ${raceId}`;
        this.con.query(query, (err, drop) => {
          if (err) {
            console.error(err);
          }

          drop.forEach((element) => {
            if (score[element["driverId"]] == undefined) {
              score[element["driverId"]] = 0;
            } else if (score[element["points"]] != undefined) {
              score[element["driverId"]] += element["points"];
            }
          });
        });
      });
      console.log(score);
    });
  }

首先,您需要將.forEach循環更改為for const of循環或只是一個常規的 for 循環,因為它只是觸發回調內的代碼並且從不等待它。 然后您需要更改您的this.con.query(...)函數,該函數也具有對 Promise 的回調。 你的代碼應該是這樣的:

const asyncQuery = (query) => new Promise((resolve, reject) => {
    this.con.query(query, (err, drop) => {
        if (!!err) {
            console.log(error);
            return reject(err)
        }
        return resolve(drop);
    })
});


async function driversBySeason(season) {
    var query = `SELECT raceId FROM races WHERE year = ${season}`;
    var score = {};
    const drop = await asyncQuery(query).catch(err => err /* some error handling */);
    for (const element of drop) {
        var raceId = element["raceId"];
        query = `SELECT driverId, points FROM results WHERE raceId = ${raceId}`;
        const drop2 = await asyncQuery(query).catch(err => err /* some error handling */);
        drop2.forEach((element) => {
            if (score[element["driverId"]] == undefined) {
                score[element["driverId"]] = 0;
            } else if (score[element["points"]] != undefined) {
                score[element["driverId"]] += element["points"];
            }
        });
        
    }
    console.log(score);
}

你在你的回調之外。 當它執行時,代碼繼續運行通過“this.con.query”。 您正在看到分配在頂部的空對象來執行此操作。 在您分配值的 drop.forEach 之后進入回調內部,或轉換為 async/await 方法。

當您調用 driversBySeason 時,您的 score 變量的值為 {}

這就是你調用它時 console.log() 的價值,因為關閉器是如何工作的,並且你使用稍后發生的回調函數更新分數......

如果你使用承諾,你會得到更好的理解......而不是回調

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM