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

Posted

技术标签:

【中文标题】在 Node.js 中异步添加到数组【英文标题】:Adding to an array asynchronously in Node.js 【发布时间】:2011-11-30 23:18:36 【问题描述】:

我对这种类型的编程很陌生,并且在从嵌套调用中填充数组时遇到了一些麻烦。我很确定这需要使用回调来完成,但我无法将我的大脑包裹在它周围。闭包也必须在这里发挥作用。我尝试在网上搜索类似的示例,但没有找到太多。

这是我的原始代码。我尝试了几种不同的方法,但没有成功。

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;

【问题讨论】:

【参考方案1】:

查看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);
    
;

【讨论】:

如果您查看源代码,您会看到基本相同的模式:执行操作,递增计数器,如果 counter==input.length 然后调用我提到的回调。基本上是DIY或图书馆的选择,但思路是一样的。 @z5h 对,变成递归循环了。 嘿机会,我检查了异步,它看起来非常有用。谢谢推荐。【参考方案2】:

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

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();
    );
  )();

【讨论】:

谢谢阿德里安,这成功了。我最终将它与下面提到的异步库一起使用来处理数组。我想我可以用调用 async.map 来替换这个递归函数,但至少我现在知道如何在不依赖库的情况下解决这个问题。【参考方案3】:

你可以这样做: 给 formatAssignee 一个回调。 倒数您需要向用户推送多少用户。 推送最后一个后,使用参数users 调用回调。

【讨论】:

以上是关于在 Node.js 中异步添加到数组的主要内容,如果未能解决你的问题,请参考以下文章

Node.js如何将数组索引传递给异步函数

如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js

Node.js Promises:异步推送到数组并保存

Node.js 异步数组迭代

异步 Node.js 循环中的变量范围

现在 Node.js 添加了 io.js,是否比以前更异步了?版本怎么了?