2017-03-19 6 views
6

私は約束しているが、サーバーからデータを収集するが、一度に50の応答しか収集しない。私は収集する250の応答があります。約束のループを作成する方法

私は一緒にこの場合

new Promise((resolve, reject) => { 
    resolve(getResults.get()) 
    }) 
    .then((results) => { 
    totalResults.concat(results) 
    return getResults.get() 
    }) 
    .then((results) => { 
    totalResults.concat(results) 
    return getResults.get() 
    }).then((results) => { 
    totalResults.concat(results) 
    return getResults.get() 
    }) 

以下のようなconcate約束は私が唯一の250件の結果を必要とすることができるので、これは管理可能ソリューションをようだが、ループ内での約束をconcatingの方法があります。だから私はループを5回実行し、毎回次の約束を実行する。

申し訳ありません私は約束を新しくしており、これがコールバックだった場合、これは私がやることです。

+1

'get'は約束を返しますか? –

+0

これについては、[async](http://caolan.github.io/async/)ライブラリをチェックアウトすることをお勧めします。それはあなたの人生を簡単にします。 'async.eachLimit'機能を見てください。 – forrestmid

+0

@forrestmidいいえ、それは約束でうまくいかない。 – Bergi

答えて

7

ifあなたはこのループを試し、その後、ループにしたいとの約束をシリアライズ、1に障害が発生した後に、他のget呼び出しを実行していない:あなたはpromise construction anti-patternを避けるべき

function getAllResults() { // returns a promise for 250 results 
    let totalResults = []; 
    let prom = getResults.get(); 
    for (let i = 0; i < 4; i++) { // chain four more times 
     prom = prom.then(results => { 
      totalResults = totalResults.concat(results); 
      return getResults.get(); 
     }); 
    } 
    return prom.then(results => totalResults.concat(results)); 
} 

注意。ここでnew Promiseを使用する必要はありません。

エラー条件を処理するために、上記の関数によって返された約束を.catch()呼び出しに追加することも検討してください。

最後に、concatは、呼び出す配列を変更しないことに注意してください。連結された配列を返します。したがって、その戻り値を割り当てる必要があります。あなたのコードでは戻り値を代入しないので、呼び出しは効果がありません。

+2

'prom = Promise.resolve([])'で始めると、 'get'呼び出しを複製する必要がなくなります連結し、適切に5までカウントします。 – Bergi

+0

ありがとうございます。これはうまく機能しています。優れた提案 –

8

おそらくPromise.allメソッドが必要です。 すべてのリクエストに対して、約束事を作成して配列に入れてから、allメソッドのすべてをラップすると完了です。 Promise.all at MDN

EDITあなたが約束この方法によって返されたデータにアクセスすることができ

let promiseChain = []; 
for(let i = 0; i <5; i++){ 
    promiseChain.push(getResults.get()); 
} 

Promise.all(promiseChain) 
    .then(callback) 

あなたがここにこの方法についての詳細を読むことができます:

例(getResults.get戻っ約束があると仮定) :

function callback(data){ 
    doSomething(data[0]) //data from the first promise in the chain 
    ... 
    doEventuallySomethingElse(data[4]) //data from the last promise 
} 
+0

OPがこのアプローチを使用してget()呼び出しの結果を取得する方法を提案しますか? – rasmeister

+0

編集を見てください) – Phugo

+0

ありがとうございますが、これは同じ50の結果を5回返します。 –

関連する問題