Node.js异步循环函数

时间:2015-04-18 11:47:12

标签: javascript node.js

我是Node.js的新手,我很难知道这是否是正确的方法:

我使用lupus来处理for循环,我正在查询twitter API,然后我尝试在返回的json中获取最大的id,因为我正在使用lodash。一旦我有了这个值,我想再次运行循环,但这次将值传递给函数。我使用async.js

循环返回JSON
lupus(0, loopLength, function(n) {

        var maxId;

        T.get('favorites/list', {count: 200, max_id: maxId}, function(err, data, response) {
          if (err) {
            throw (err);
          }

          maxId = _.max(_.pluck(data, "id"));

          async.each(data, function(file, callback) {
            console.log(file)
          }, function(err){
            if( err ) {
              console.log('A file failed to process: '+ err);
          });
        })


      }, function() {
        console.log('All done!');
      });
})

似乎maxId永远不会被设置,因此.each循环永远不会获得下一组JSON。我的问题是我是否正确执行此操作,如何从.each函数中获取maxId的值。

1 个答案:

答案 0 :(得分:1)

问题在于你有两个异步事件(狼疮“循环”和T.get调用)并且它们之间基本上没有协调。

因为T.get将是异步的,所以我不会在这里使用lupus(呃!):

var index = 0;
var maxId;
next();
function next() {

  T.get('favorites/list', {count: 200, max_id: maxId}, function(err, data, response) {
    if (err) {
      throw (err);
    }

    maxId = _.max(_.pluck(data, "id"));

    async.each(data, function(file, callback) {
      console.log(file)
    }, function(err){
      if( err ) {
        console.log('A file failed to process: '+ err);
    });

    if (++index < loopLength) {
      next();
    } else {
      console.log('All done!');
    }
  });
}

代码中有一些不相关的东西看起来不正确:

  1. 在第一次调用maxId时,如果您从未为其分配过值,则表示您正在使用T.get。好像你想要某种初始价值。

  2. 您在T.get回调中抛出错误。 T.get的文档是否告诉您它会对该错误做一些有用的事情?如果没有,您可能想要做其他事情。例如,扔在那里就不会停止原始代码中的循环(使用上面的代码)。