nodejs async控制流与循环

时间:2016-08-01 12:21:56

标签: javascript node.js synchronization control-flow

此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'}
    ]

但是我期待一系列不同的配置文件。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以在此处混合使用同步和异步代码。您的forEach循环同步运行,但Profile.findOne方法是异步的。然后它调用传递给初始函数的回调。您应该查看使用async for an asynchronous for loop

但是,您的问题中有很多内容表明您还没有完全掌握Node.js的异步特性。请尝试阅读相关主题,例如callback hell

答案 1 :(得分:0)

使用 async 或承诺

var async = require('async');
...
async.map(users, Profile.findOne, function(err, results) {
    if (err)
        return ...// process errors;

    userlist = results; 
})