2016-04-22 55 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