通过for循环将函数插入异步

时间:2014-02-06 18:58:59

标签: javascript node.js asynchronous node-async

我有以下功能:

module.exports = {
  listAccounts: function (callback) {
    var acc = [];
    var calls = [];

    function processAccounts(account, cb) {
      client.getAddressesByAccount(account, function (err, addresses) {
        console.log('getting account', account);
        acc.push({name: account, addresses: addresses});
        return cb();
      });
    }

    client.listAccounts(function (err, res) {
      if (err)
        return callback(err)
      else {
        for (var key in res) {
          calls.push(
            function (cb) {
              processAccounts(key, cb);
            }
          );
        }


        async.parallel(calls, function (err, results) {
          console.log(acc);
        })

      }
    })

  }

}

我想要做的是使用for循环将所有函数推送到calls数组,然后运行async.parallel来运行所有函数。

问题是,在for循环结束后,calls数组看起来像这样:

function (cb) {
              processAccounts(key, cb);
            },function (cb) {
              processAccounts(key, cb);
            },function (cb) {
              processAccounts(key, cb);
            }

它不会将key转换为实际值,而是将其保留为key

2 个答案:

答案 0 :(得分:1)

使用函数创建一个新的范围,其值可以是闭包中的容器。

var res = {a:'hello', b:'howdy'};
var calls = [];

for (var key in res) {
    calls.push(
        (function(k) {
            return function (cb) {
                console.log('say: ' + res[k] + ' to ' + cb);
            }
        })(key)
    );
}

calls[0]('you');
calls[1]('me');

打印:

说:你好。

说:你好吗

答案 1 :(得分:0)

我认为你想要的是async.each

async.each(calls, function(key, cb) {
  processAccounts(key, cb);
},
function(err){
    if (err)
       console.log('oh no!', err);

    console.log('all accounts processed');
});