async.series函数......这是正确的approch?

时间:2016-04-22 22:15:00

标签: node.js asynchronous

下面是代码:

var async = require('async');
var GitHubApi = require('github');

var github = new GitHubApi({
   version: '3.0.0'
});

var getUserAvatarWithCallback = function(user, callback) {
   github.search.users({ q: user }, function(err, res) {
      if (err) { callback(err, null); }
      else {
        var avatarUrl = res.items[0].avatar_url;
         callback(null, avatarUrl);
      }
    });
};

    async.series([
       function(callback1) {

         for( var i = 0, length = 3; i < length; i++ ) {
            getUserAvatarWithCallback('samucich', function(err,avatar) {
               if (err) { console.log('Error: ',err) };
               console.log('got url from Git',avatar);
            });
          }
         callback1()
    },
       function(callbackAfterLoop) {

         for( var i = 0, length = 10; i < length; i++ ) {
            console.log('loop ',i);
          }

       callbackAfterLoop()
    },
       function() {
       console.log('Done');
    }
    ]);//async

输出:

loop  0
loop  1
loop  2
loop  3
loop  4
loop  5
loop  6
loop  7
loop  8
loop  9
Done
got url from Git https://avatars.githubusercontent.com/u/4983338?v=3
got url from Git https://avatars.githubusercontent.com/u/4983338?v=3
got url from Git https://avatars.githubusercontent.com/u/4983338?v=3

如果我理解正确的话,Node会将对Git api的调用放到它的事件堆栈上,然后在完成后调用我的程序。所以这就是为什么在输出中,我看到异步数组中第2和第3个函数的输出,在我看到第1个异步函数的输出之前... Git api调用需要更多时间...我得到了

我的问题是如何让它等待api调用Git完成并返回,然后转移到异步数组中的第二个函数?是async.series错误的approch?

非常感谢...... Sam

2 个答案:

答案 0 :(得分:0)

好的,我测试了包和你的代码,希望现在有用了:

看起来async.series运行一系列中的每个函数,等待特定的回调,告诉它何时移动到下一个函数。

但是,如果在本系列中运行带有异步函数的循环,则需要让系列知道完成所有异步函数的时间。

添加一个条件,在遇到时触发回调。不幸的是,这似乎不是一种非常灵活的方法,因为您需要事先知道长度。

var count = 0;

async.series([
  function(callback1) {
    for(let i = 0; i < 3; i++) {
      getUserAvatarWithCallback('samucich', function(err,avatar) {
        if (err) { console.log('Error: ',err) };
        console.log('got url from Git',avatar);
        if (count === 2) {
          callback1();
        }
        count++;
      });
    }
  },
  function(callbackAfterLoop) {
    for( var i = 0, length = 10; i < length; i++ ) {
      console.log('loop ',i);
    }
    callbackAfterLoop()
  },
  function() {
    console.log('Done');
  }
]);//async

从Git https://avatars.githubusercontent.com/u/4983338?v=3获取网址

从Git https://avatars.githubusercontent.com/u/4983338?v=3获取网址

从Git https://avatars.githubusercontent.com/u/4983338?v=3获取网址

循环0

...

循环9

完成

答案 1 :(得分:0)

尝试使用async.waterfall模块在第一次回调执行后实现,然后第二次执行。