ForEach(内置异步函数)完成后的回调

时间:2014-03-24 11:18:41

标签: javascript asynchronous foreach callback sync

我有一个带有异步函数的.forEach循环,我的代码在循环结束前执行我的callback()。
有没有办法让它完成循环,然后继续我的回调() 这是我的代码:

var transactions = [];
t.transactions.forEach(function(id){
    client.query('SELECT * FROM transactions WHERE id = $1;', [id], function(err, result) {
        if(!err){
            transactions.push({from : result.rows[0].from, to : result.rows[0].to, amount : result.rows[0].amount, time : result.rows[0].ct, message : result.rows[0].message, id : result.rows[0].id});
        }
    });
});
callback(transactions);
return done();

1 个答案:

答案 0 :(得分:1)

使用forEach的索引参数来测试您是否参与了最后一笔交易:

var transactions = [];
t.transactions.forEach(function(id, idx){
    client.query('SELECT * FROM transactions WHERE id = $1;', [id], function(err, result) {
        if(!err){
            transactions.push({from : result.rows[0].from, to : result.rows[0].to, amount : result.rows[0].amount, time : result.rows[0].ct, message : result.rows[0].message, id : result.rows[0].id});
        }
        // If this is the last transaction, do the callback
        if(idx === t.transactions.length - 1) callback(transactions);
    });
});

由于您每个交易只有一个查询,因此您可以将测试置于查询的回调中。