2016-04-22 6 views
0

HERESにコード: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への呼び出しを入れて、再び私のプログラムを呼び出しています彼らの完了時。だから、出力では、非同期配列の2番目と3番目の関数の出力を見る前に、1番目の非同期関数の出力を見る前にGit api呼び出しに時間がかかります。 。

私の質問は、これを完了して戻って、非同期配列の2番目の関数に移動するには、GitのAPI呼び出しを待つためにこれを得ることができますか? async.series間違ったapprochですか?

async.seriesは、特定のコールバックを待っているシリーズで、各機能を実行します表示されます:私はパッケージとあなたのコードをテストし、うまくいけば、これは今便利ですmuchly ...サム

答えて

0

がOK

感謝次の関数の行に移動するタイミングを指示します。

しかし、このシリーズ内で非同期関数を使用してループを実行する場合は、すべての非同期関数が完了したときにシリーズに知らせる必要があります。

条件が満たされたときにコールバックを発生させる条件を追加します。残念ながら、これは長さを事前に知る必要があるため、非常に柔軟な方法のようには見えません。

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 

は... https://avatars.githubusercontent.com/u/4983338?v=3

https://avatars.githubusercontent.com/u/4983338?v=3

ループ0

Gitのhttps://avatars.githubusercontent.com/u/4983338?v=3からURLを得たGitリポジトリからURLを得たGitリポジトリからURLを得た

ループ9

は、最初のコールバックが第二は、実行する必要があり、その後に実行した後に達成するためにasync.waterfallモジュールを使用してみてください

+0

Dreamlinesがあります...非同期モジュールをまったく使用しないと言っていますか? –

+0

が試験された。回答を更新する。 – Dreamlines

+0

'count'をインクリメントした後、' count'をインクリメントした後で、その値がターミナル値であるかどうかを確認してください。あなたがやっているやり方はかなり奇妙で、それほど簡単ではありません。あなたのコードを読むときの私の最初の質問は、 'count'が' 3'の代わりに '2'であるかどうかをチェックしている理由です。あなたがまだカウンターを増やしていないからです。それは起こるのを待っているバグです。 – jfriend00

0

を完了します。

+0

コード例では、特に、OPのコードの中で 'async.waterfall()'の使い方を見せてくれれば、これはもっと便利な答えになります。 – jfriend00

関連する問題