2017-07-11 17 views
-1

私はforループを持っており、各繰り返しで非同期関数を呼び出す必要があります。しかし、私はJSスタックトレースエラーを取得しています。以下は私のコードのプロトタイプです。私もIIFEパターンを使用しましたが、うまくいきません。forループ内でJavaScript async関数を呼び出す

for(let i = 0; i<99999;i++){ 
    getData(i, function(err, result){ 
     if(err) return err; 
     else{ 
     console.log(result); 
     } 
    }); 
} 
function getData(number, callback){ 
    request('http://someapiurl'+number, function(err, response){ 
    if(err) callback(err, null); 
    else{ 
     callback(null, response) 
    } 
    }) 
} 
+0

ループの次の繰り返しを実行する前にgetDataの結果を待つ場合は、forループを使用できません。 –

答えて

-1

99999を同時に作成しようとすると、これはほとんどのブラウザでうまくいきませんでした。

代わりに約束を使用し、配列内でプッシュし、Promise.allを使用してブラウザが要求を処理できるようにして、最終的に解決された応答を処理します。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

var p1 = Promise.resolve(3); 
var p2 = 1337; 
var p3 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 100, 'foo'); 
}); 

Promise.all([p1, p2, p3]).then(values => { 
    console.log(values); // [3, 1337, "foo"] 
}); 
-1

まず第一に、私は非常にあなたがのためのループで発生まさに見るためにあなたのコードをデバッグすることを示唆しています。

その内容(getData関数)が実行される前にループが完全に実行され、データ取得要求を介した非同期動作が発生する可能性が非常に高いです。 IIFEパターンを使用しようとすると、内容を確実に実行できるように、少なくともforループの中に内容をラップしていました。実装の例はそうのようになります。@mikaはあなたが彼らの答えに読むことができますあなたのための約束、の主題の上に座るようにするに

for(let i = 0; i<99999;i++){ 
    (function(){ // <-- IIFE used to represent a closure. 
    getData(i, function(err, result){ 
     if(err) return err; 
     else{ 
      console.log(result); 
     } 
    }); 
    })(i); 
} 

。お約束のアンチパターンを覚えておいてください。約束に慣れておらず、forループでそれらを使用したい場合は、特に難しいです。

関連する問題