在Node.js中异步添加到数组

时间:2011-10-04 19:32:21

标签: arrays node.js asynchronous callback

我对这种类型的编程很新,我在嵌套调用中填充数组时遇到了一些麻烦。我很确定这需要使用回调来完成,但是我在绕着它缠绕脑子时遇到了麻烦。关闭也必须在这里发挥作用。我尝试在网上搜索类似的例子,但没有找到太多。

这是我的原始代码。我尝试了一些不同的方法,但没有把它拉下来。

TaskSchema.statics.formatAssignee = function(assignees) {
  var users = [];

  assignees.forEach(function(uid) {
    mongoose.model('User').findById(uid, function(err, user) {
      users.push({
          name: user.name.full
        , id: user.id
      });
    });
  });

  return users;
}

3 个答案:

答案 0 :(得分:6)

我非常喜欢以下模式(递归是异步循环最优雅的解决方案):

TaskSchema.statics.formatAssignee = function(assignees, callback) {
  var acc = []
    , uids = assignees.slice()
  (function next(){
    if (!uids.length) return callback(null, acc);

    var uid = uids.pop()
    mongoose.model('User').findById(uid, function(err, user) {
      if (err) return callback(err);
      acc.push({
        name: user.name.full
      , id: user.id
      });
      next();
    });
  })();
}

答案 1 :(得分:2)

签出async,它有一个异步的foreach循环。

修改

以下是async library

中的foreach方法
async.forEach = function (arr, iterator, callback) {
    if (!arr.length) {
        return callback();
    }
    var completed = 0;
    _forEach(arr, function (x) {
        iterator(x, function (err) {
            if (err) {
                callback(err);
                callback = function () {};
            }
            else {
                completed += 1;
                if (completed === arr.length) {
                    callback();
                }
            }
        });
    });
};
var _forEach = function (arr, iterator) {
    if (arr.forEach) {
        return arr.forEach(iterator);
    }
    for (var i = 0; i < arr.length; i += 1) {
        iterator(arr[i], i, arr);
    }
};

答案 2 :(得分:0)

你可以这样做:
给formatAssignee一个回调 减少推送用户所需的用户数量 在推送最后一个之后,使用参数users调用回调。