簡體   English   中英

等待 for 循環中的函數完成

[英]Wait for functions in for loop to finish

我在 NodeJS 中有一個 for 循環。 循環內部是一個從數據庫中獲取數據的函數。

var player2.schedule = {
  opponent: //string
  datetime: //date object
}

var schedule = "";

for (i=0; i<player2.schedule.length; i++) { 
  User.findOne({ id: player2.schedule[i].opponent }.select("name").exec(function(err, opponent) {
    schedule += opponent.name;
  });
}

每次循環循環時,循環都會將數據庫調用的結果添加到可變schedule

現在我的問題是,如果我在依賴於這個schedule變量的 for 循環之后有代碼,它不能。 因為變量是在數據庫調用的回調函數中更新的,for 循環之后的任何代碼都是異步發生的,所以變量沒有及時更新。

如何確保下一批代碼等待 for 循環和回調首先完成?

這是一個使用async的簡單示例:

var async = require('async');

async.each(player2.schedule, function(item, cb) {
  User.findOne({ id: item.opponent })
      .select("name")
      .exec(function(err, opponent) {
    if (err)
      return cb(err);
    schedule += opponent.name;
    cb();
  });
}, function(err) {
  if (err)
    throw err;
  console.log('All done');
});

您可以使用異步庫函數 while() 等待所有查詢完成:

var async = require('async');
var i = 0;
var len = player2.schedule.length;
async.whilst(
  function () { return i < len; },
  function (callback) {
    User.findOne({ id:player2.schedule[i].opponent}.select("name").exec(function(err, opponent) {
      schedule += opponent.name;
      i++;
      callback(null);   // assume no error (null)
    });
  },
  function (err) {
    // this function is executed after all queries are done
    // schedule now has everything from the loop
  } 
);

暫無
暫無

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

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