2016-04-22 58 views
0

继承人的代码:async.series函数...这是正确的接近?

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 

如果我理解这个正确的,节点是放调用Git的API在其上的事件堆栈,然后调用我的程序回来当他们完成。所以这就是为什么在输出结果中,我看到异步数组中的第二个和第三个函数的输出,然后我看到第一个异步函数的输出... Git api调用需要更多时间...我得到。

我的问题是我怎么能得到这个等待的API调用Git完成并返回然后移动到异步数组中的第二个函数?是async.series错误的接近?

感谢长久......山姆

回答

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 

了URL从Git的https://avatars.githubusercontent.com/u/4983338?v=3

了URL从Git的https://avatars.githubusercontent.com/u/4983338?v=3

了URL从Git的https://avatars.githubusercontent.com/u/4983338?v=3

环路0

...

环9

完成

+0

谢谢Dreamlines ...所以你说不要使用异步模块?经测试 –

+0

。更新答案。 – Dreamlines

+0

可能更好地增加'count',然后在您增加'count'之后,检查它的值以查看它是否在终端值。你这样做的方式很奇怪,并不容易遵循。在阅读你的代码时,我的第一个问题是你为什么要检查'count'是否是'2'而不是'3'。那么,答案是因为你还没有增加柜台。这是一个等待发生的错误。 – jfriend00

0

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

+0

一个代码示例将使这个更有用的答案,特别是如果你显示OP如何在代码的上下文中使用'async.waterfall()'。 – jfriend00