[英]nodejs async control flow with loop
此NodeJS代码有什么问题?
我有以下NodeJS片段。
Profile.findOne(profileId, cb) //is sync function
function getProfiles(users, cb) {
var results = [];
var n = users.length;
users.forEach(function(user, i) {
Profile.findOne(user.profileId, function(err, prf) {
if (err) {
return cb(err, null);
}
console.log(prf);
console.log(user.profileId);
results.push(prf);
if (i + 1 == n) {
console.log('looping done');
return cb(null, results);
}
});
});
}
// some where
var userslist = [{
name: 'ab',
profileId: 'daf242'
}, {
name: 'cd',
profileId: 'hg535h'
}, {
name: 'ef',
profileId: 'cvxv445'
}];
getProfiles(userslist, function(err, data) {
if (err) {
//do this
} else {
//do that
}
});
问题在于结果是第一个profileId的仅 配置文件的数组。 喜欢
[
{username:'ab',avatarUrl:'abcd.png'}
{username:'ab',avatarUrl:'abcd.png'},
{username:'ab',avatarUrl:'abcd.png'}
]
但我期望有很多differnet配置文件。
我想念什么?
您在这里混合同步和异步代码。 您的forEach循环正在同步运行,但是Profile.findOne
方法是异步的。 然后,它调用传递到初始函数中的回调。 您应该考虑将async
用于异步for循环 。
但是,您的问题中有很多事情表明您尚未完全掌握Node.js的异步特性。 尝试阅读有关该主题的内容,例如callback hell 。
使用异步或承诺
var async = require('async');
...
async.map(users, Profile.findOne, function(err, results) {
if (err)
return ...// process errors;
userlist = results;
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.