在node.js中完成for循环后的callback

我需要一些关于node.jsasynchronous特性的帮助。 我有一个for循环,从数据库中收集数据。 “结果”是一个数组,然后应该返回到主函数。

user_collection.findOne({ _id : uid }, function(error, user) { if(error) callback(error) else { for(var j = 0; j < user.contacts.length; j++) { if(user.contacts[j].accepted == 'true') { user_collection.findOne({ _id : user.contacts[j].contactId }, function(error, user) { result.push(user); }) } } callback(null, result); // This callback executes before the for-loop ends, ofc } }); 

如何确保循环完成后执行callback?

你可能要考虑使用像async https://github.com/caolan/async这样的助手&#x5E93;

它有助于保持代码更一致..

在你的情况下,你可以看看forEach()方法

 forEach(arr, iterator, callback) 

迭代器用列表中的项目和callback完成时调用。

检查unit testing的例子

https://github.com/caolan/async/blob/master/mocha_test/each.js

使用ES6 Promise(承诺库可用于旧版浏览器):

处理保证同步执行的所有请求(例如,1然后2然后3)

 function asyncFunction (item, cb) { setTimeout(() => { console.log('done with', item); cb(); }, 100); } let requests = [1, 2, 3].reduce((promiseChain, item) => { return promiseChain.then(new Promise((resolve) => { asyncFunction(item, resolve); })); }, Promise.resolve()); requests.then(() => console.log('done')) 

处理所有的asynchronous请求而不是“同步”执行(2可能会比1完成)

 let requests = [1,2,3].map((item) => { return new Promise((resolve) => { asyncFunction(item, resolve); }); }) Promise.all(requests).then(() => console.log('done')); 

我是这样做的

 Promise.all(body.schedules.map(function(scheduleId) { return new Promise(function(resolve, reject) { return scheduleSchema.findOneAndRemove({ _id: scheduleId }) .then(function() { logSchema.insert({ userId: req.user.id, actId: constants.LOG_SCHEDULE_DELETE.id, extData: scheduleId }); resolve(); }) .catch(function(err) { reject(err); }); }); })).then(function() { return res.json({ code: constants.SUCCESS_CODE }); }).catch(function(err) { return res.json(constants.DATABASE_ERROR); }); 

最后一个例子

 function callback (result) { console.log('all done'); } [1, 2, 3].forEach((item, index, array) => { asyncFunction(item, () => { if (index === array.length - 1) { callback(); } }); }); 

这并不保证所有项目处理完成后都会执行callback。 它只保证在最后一个项目被处理后执行callback。

更多信息

迈克尔。

与Async.js的v1.5.2,它是每个 。

 each(arr, iterator, [callback]) 

arr – 要迭代的数组。
迭代器(item,callback) – 应用于arr中每个项目的函数。
callback(err) – 可选。 当所有迭代器函数完成或发生错误时调用的callback函数