2017-01-17 17 views
1

ループ内で非同期関数を呼び出す関数を記述しようとしています。結果。ループ内で非同期関数を使用し、ループが終了した後でコールバックを呼び出す

このような何か:

function foo(cb){ 
    var result; 
    for(var i=0; i < 999; i++){ 
     asyncFunction(i, function(val){ 
      do something with result 
     }); 
    } 
    cb(result); 
} 

しかし、私はそれが実際にすべてのasyncFunctionの呼び出しから戻る終わる前に、それはcb(result);になっていることがわかります。

cbを呼び出す前に、ループの終了を待つために何ができるのですか?約束は助けになるのだろうか?

+0

はい。約束は正しい方法です – Rajesh

+0

しかし、私は同じ問題に遭遇しませんか?約束が成就したことを伝えるものは何ですか? @Rajesh – shinzou

+0

以下は、コールバックを使用したサンプル[JSFiddle](https://jsfiddle.net/RajeshDixit/o5vc1t72/)です。約束を使って似たようなことをする必要があります – Rajesh

答えて

1

多分これはあなたがより多くのことができます:

function asyncFunction (callback) { 
    // Do stuff 
    return callback() 
} 

function foo() { 
    var result = 0 
    for (var i = 0; i < 999;) { 
    asyncFunction(function() { 
     i++ 
     result += i 
    }) 
    } 
    console.log(result) 
} 

foo() 
+0

これはあまりにもブロックしている、ブラウザがスタックになる... – shinzou

+0

それは私のためではありません、ここでフィドルです:https://jsfiddle.net/ahrxc9gg/ asyncFunctionが500ミリ秒終了すると、スクリプトは〜8分で作業する必要があります... – Potray

+0

このように動作するように実際の関数を変更するときは、境界が999より大きく、asyncFunctionが重くなる可能性があります。 – shinzou

1

非同期ライブラリあなたが必要なすべての機能があります。http://caolan.github.io/async/

+0

いいライブラリのようですが、私は1つの関数のためだけに完全なライブラリを追加したくない... – shinzou

+0

完全なライブラリを追加する必要はなく、ES2015インポート機能を使用して、必要な機能だけを追加することができます: '$ npm install --save async-es' 'async-es/{MODULE_YOU_NEED}'からのインポート{MODULE_YOU_NEED}; 'async-es'からasyncをインポートする ' – Potray

+0

私はクライアント側でこれを必要としますが、コンソールで 'import {MODULE_YOU_NEED} ...'を実行することになっていますか? Windowsでは動作しないためです。 – shinzou