【发布时间】:2016-02-26 18:16:15
【问题描述】:
所以,我正在尝试在forEach 中串联运行异步函数和同步操作:
Exchange.all().then(function (result) {
if (!result) {
return res.json({success: false, error: 'No exchanges records were found.'});
}
var exchanges = [];
result.forEach(function (exchange) {
var getCurrencyPairs = function (pairsResult) {
CurrencyPair.findAll({where: {exchangeId: exchange.id}}).then(function (pairs) {
var currencyPairs = [];
pairs.forEach(function (pair) {
var data = pair.dataValues;
currencyPairs.push({
baseCurrency: data.baseCurrency,
quoteCurrency: data.quoteCurrency,
marginPercentage: data.marginPercentage
});
});
return pairsResult(null, currencyPairs);
});
};
async.waterfall([
getCurrencyPairs
], function (err, currencyPairs) {
exchanges.push({
id: exchange.stringId,
name: exchange.name,
currencyPairs: currencyPairs,
depositAddress: 'sample address for now'
});
// here I have `exchanges` filled correctly after each loop iteration
});
});
// here `exchanges` is completely empty
return res.json({success: true, data: exchanges});
});
一切正常,除了forEach 循环完成后exchanges 数组为空。 AFIK,forEach 是同步的,所以我不必从它返回任何回调,并且在forEach 完成之前,该过程不会到达return res.json(),对吧?另外,在循环内部,我将值分配给在循环外部声明的全局变量。我不明白为什么这个过程会这样 - 全局数组 exchanges 在循环内被正确填充,但在循环外已经是空的。
我想也许我必须将整个 result.forEach 封装在另一个函数中,并将其结果作为回调返回,但是:
- 我不明白这是正确解决方案背后的逻辑
- 我无法想象如何实现它
【问题讨论】:
标签: node.js asynchronous callback