2017-01-24 4 views
0

私は、それぞれが遅延で区切られた "リクエスト"の配列を順次ロードしようとしています。遅延付きシーケンシャルプロミスループ

私は約束を使用していますが、何らかの理由により、要求が並行してではなく並行して実行されることに問題があります。

私は以下のようなテストコードを書いています。できます!要求を出して処理し、timesOutを3秒間実行し、2回目の要求に進みます。

var batches = [of_objects]; 
 
var sequence = Promise.resolve(); 
 
var self = this; 
 

 
sequence 
 
    //Create request for first batch 
 
    .then(function(){ 
 
     return self._createRequestPromise(batches[0]); 
 
    }) 
 
    //callback so we can update, returns nothing 
 
    .then(callback) 
 
    //add 3 sec timeout before next request 
 
    .then(function(){ 
 
     return new Promise(function (resolve, reject){ 
 
      setTimeout(resolve, 3000); 
 
     }); 
 
    }) 
 
    //Create request for second batch 
 
    .then(function(){ 
 
     return self._createRequestPromise(batches[1]); 
 
    }) 
 
    //callback so we can update, returns nothing 
 
    .then(callback) 
 
    //add 3 sec timeout before next request 
 
    .then(function(){ 
 
     return new Promise(function (resolve, reject){ 
 
      setTimeout(resolve, 3000); 
 
     }); 
 
    }); 
 

 
return sequence;

しかし、できるだけ早く私はそれをループの任意の並べ替えを配置しようとして、私の要求が同時にすべてを発射しています。そしてタイムアウトコールは後に起こります。

私は何が間違っているのか誤解しているのか分かりません。

//object I need to use to construct requests 
 
var batches = [of_objects]; 
 
var sequence = Promise.resolve(); 
 
var self = this; 
 

 
batches.forEach(function(batch){ 
 
    sequence 
 
    //Function returns promise 
 
    .then(function(){ 
 
     return self._createRequestPromise(batch); //this runs first 5x 
 
    }) 
 
    //callback so we can update, returns nothing 
 
    .then(callback) 
 
    //add 3 sec timeout before next request 
 
    .then(function(){ 
 
     return new Promise(function (resolve, reject){ 
 
      setTimeout(resolve, 3000); //this runs after 5x 
 
     }); 
 
    }); 
 
}); 
 
return sequence;

+0

シーケンスをよく書かれている、あなたの問題は、ループである:それはすべてあなたのシーケンスが同時に実行されているので、ブロックされていません。この回答は役に立ちます:http://stackoverflow.com/a/40394679/6320039 –

答えて

2

問題は、連続操作のいずれかを含めるようにsequenceを更新していないので、それらのすべてが、その本来の解決の約束のオフの連鎖されていることです。それらを遅延させるものは何もないので、すぐに実行します。

あなたがチェーンの最後オフの連鎖しているので、単純にすべてのループ上sequence変数を更新することでこの問題を解決することができるはずです。個人的に

//object I need to use to construct requests 
var batches = [of_objects]; 
var sequence = Promise.resolve(); 
var self = this; 

batches.forEach(function (batch){ 
    sequence = sequence   // <-- here 
     //Function returns promise 
     .then(function(){ 
      return self._createRequestPromise(batch); //this runs first 5x 
     }) 
     //callback so we can update, returns nothing 
     .then(callback) 
     //add 3 sec timeout before next request 
     .then(function(){ 
      return new Promise(function (resolve, reject){ 
       setTimeout(resolve, 3000); //this runs after 5x 
      }); 
     }); 
}); 

return sequence; 

を、私は、変数を上書きしないようにしてください変数再割り当てすることなく、これを実行する別の方法は、.reduce()を使用することです:

//object I need to use to construct requests 
var batches = [of_objects]; 
var self = this; 

return batches.reduce(function (last, batch){ 
    return last 
     //Function returns promise 
     .then(function(){ 
      return self._createRequestPromise(batch); //this runs first 5x 
     }) 
     //callback so we can update, returns nothing 
     .then(callback) 
     //add 3 sec timeout before next request 
     .then(function(){ 
      return new Promise(function (resolve, reject){ 
       setTimeout(resolve, 3000); //this runs after 5x 
      }); 
     }); 
}, Promise.resolve()); 
+0

偉大な、最初の答えは確かに私の問題を解決します!なぜ私は正確に調査します。 –

+0

多分他の人にとって、私は実際問題に遭遇したときにreduce関数を使い始めました。私の最初の問題は、私が最後に最後に戻った、この答えのように連鎖していないということでした。だから私のために2つの答え:) –

+0

@ JeroendeLau私は見るので、あなたは基本的に両方の試みで同じミスを犯していた。お役に立てて嬉しいです。 :) – JLRishe