2016-11-22 21 views
0

私はタスクのリストを処理するためにpromisesを使用しています:Javascript - ループで約束を正しく処理するには?

これはコードのサンプルです:

var array = ["aaa", "bbbb", "cccc", "dddd", "eeee"]; 
var result = []; 
var p = Promise.resolve({ 
    then: function(onFulfill, onReject) { 
    array.forEach(function(x){ 
    // http request with x and make sure this request ends before a new one if fired 
    // put http resolte in array : result.push(httpRespose); 
    }); 
    //when done, onFulfill(result) 
} 
}); 
p.then(
function(v) { 
    console.log(v); // "fulfilled!" 
    }, function(e) { 
     console.log(e); // not called 
}); 

私が作ることができるようにしたいと配列からすべての要素を使用してHTTPリクエスト、その後に結果を置きます他の配列を返し、完了したらその新しい配列を返します。また、httpの結果が同じ順序で追加されることを確認することが可能かどうかを知りたい(あまり重要ではない)。

誰かが助けてくれますか?

+0

は約束の配列を作成し、Promise.all' 'とそれらを解決:https://developer.mozilla.org/en-US/docs/Web/JavaScript/順次実行を確実にするために、上記のようにアプローチ参照/ Global_Objects/Promise/all。 –

+0

すべての約束を配列に集約し、[Promise.all](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)を使用して、彼らはすべて完了しました。 –

+0

'x httpでリクエストし、このリクエストが終了する前にこのリクエストが終了することを確認します.'その場合、promise.allは不要です。 –

答えて

1

Promise.allは、いくつかの約束を待つために使用されます。

あなたは、約束を作成し、配列に押し込み、その後

Promise.all(myPromiseArray).then(allDoneHandler)

を使用するたびにここに例を示します

var items = [ 500, 1000, 1500 ]; 
 
var results = []; 
 
items.forEach((item) => { 
 
    let promise = new Promise((resolve) => { 
 
    setTimeout(() => { 
 
     console.log(item); 
 
     resolve(item); 
 
    }, item); 
 
    }); 
 
    results.push(promise); 
 
}); 
 
Promise.all(results).then(() => { 
 
    console.log('done!'); 
 
}); 
 
     

+0

Nit: 'var results = items.map(item =>新しいプロミス(...));' –

+0

@FelixKlingありがとう。それは私の例ではうまくいくでしょうが、単純化のために私はあまりにも多くを圧縮したくありませんでした。 – xdumaine

+0

ワンライナー:Promise.all(items.map(makeAjaxRequest)))。then(console.log) – tjoskar

1

"約束を実行" するにはシーケンス(特にArrayから)でこのパターンを使用できます:

0123我々は結果を蓄積するために Array.map()Promise.all()を使用して、および類似している

var donePromise = arrayOfData.reduce(function(sequence, value, index){ 
    return sequence.then(function(){ 
     //doSomethingWithValueAndReturnAPromise 
    }) 
}, Promise.resolve()); 

ができますが、結果が蓄積したいから、とだけでなく、インジケータジョブが実行されたときに、私たちはこれをmodufyする必要があります

var urls = [/*...*/]; 

var _sequence = Promise.resolve(); 
Promise.all(urls.map(function(url) { 
    return _sequence = _sequence.then(function(){ 
     //fetch the url and return a Promise: 
     //return fetch(url).then(response => response.text()) 
    }); 
})).then(function(results){ 
    //console.log(results) 
}); 
関連する問題