JobRequest.findByJobId
是一個異步操作。您無法使用JavaScript阻止異步操作,因此您需要手動通過計數進行同步。示例(錯誤處理略去了的緣故):
var results = [];
var pendingJobCount = ids.length;
_.forEach(ids, function(id) {
JobRequest.findByJobId(id, function(err, result) {
results.push(result);
if (--pendingJobCount === 0) callback(null, results);
});
});
有,當然,包裝結構做這樣的東西,但我更願意解釋它是如何實際工作。查看dfsq's answer瞭解其中一種包裝的更多細節,稱爲承諾。
另請注意,異步操作可能無序完成。 results
陣列中的順序不一定匹配ids
陣列的順序。如果你需要連接的信息,你需要通過收集在地圖上,而不是一個數組的結果,自己跟蹤它,例如:
var results = {};
var pendingJobCount = ids.length;
_.forEach(ids, function(id) {
JobRequest.findByJobId(id, function(err, result) {
results[id] = result;
if (--pendingJobCount === 0) callback(null, results);
});
});
這個例子假設有你ids
數組沒有重複。重複鍵的結果將被覆蓋。
通過在結果中插入附加信息,錯誤處理的工作方式類似。又如:
results.push({id: id, error: null, value: result});
你應該使用'async.map'。 – SLaks