2016-08-17 15 views
0

これはコードの下にありますが、widgetsAddCallが配列に追加されるとすぐに実行され、promise.eachは使用されません。Bluebird async series call

機能widgetsAddCallがAPIサーバーに対して非同期要求を行い、ブルーバードの承認済みリクエストを返します。私はそのAPI呼び出しが次々に行われ、各呼び出しが次々とデータのチャンクを送信するようにしたい。

var chunkCnt = Math.ceil(widgetsIds.length/4000); 
var responseT = Array(); 
var Promise = require('bluebird'); 

for(var cntTemp =0 ; cntTemp<chunkCnt;cntTemp++){ 
    var tempWidgs = widgetsIds.slice(cntTemp,cntTemp+4000); 
    var query = { 
     id: tempWidgs.join(',') 
    }; 
    responseT.push(widgetsAddCall(tempWidgs,query,campRemoteId,campaign)); 
} 

    return Promise.each(responseT,function(responses) { 
     // Use the responses here 
     return getWidgets(campRemoteId,campaign).then((ids) => { 
      var toRemove = []; 
      for(var id of ids){ 
       if(widgetsIds.indexOf(id)===-1){ 
        toRemove.push(id); 
       } 
      } 
      if(toRemove.length) { 
       return removeWidgets(campaign, campRemoteId, toRemove); 
      } 
     }); 
    }) 

答えて

0

私は、各コール は別の後にデータ1のチャンクを送信するようにAPIコールが、次々に行われることを望みます。すべての呼び出しをシリアル化する私は考えることができる

最も簡単な方法は、配列の中に、あなたのチャンクを事前に作成して、連続的配列を反復処理するためにブルーバードのPromise.mapSeries()を使用することです:

FYI
var Promise = require('bluebird'); 

// pre-build chunks into an array 
var chunks = []; 
var chunkCnt = Math.ceil(widgetsIds.length/4000); 
for (var chunkIndex = 0; chunkIndex < chunkCnt; chunkIndex++) { 
    chunks.push(widgetsIds.slice(cntIndex,cntIndex + 4000)); 
} 

// now serially iterate the array 
Promise.mapSeries(chunks, function(item) { 
    return widgetsAddCall(item, {id: item.join(',')}, campRemoteId, campaign); 
}).then(function(results) { 
    // now process the results of widgetsAddCall() here 
}); 

Promise.each()のオリジナルの使用は、あなたが一連の約束を反復していたが、反復の情報を使用していなかったので、私には分かりませんでした。反復には何の指摘もないようだった。さらに、これらのコールをすべて並行して起動していたため、widgetsAddCall()への通話を正しくシリアル化していませんでした。

+0

ありがとう、ちょっと入力してくださいPromise.mapSeries –

+0

@SanketMehta - あなたの質問に答えてくれるかもしれないので、受け入れ。これはまた、適切な手順に従うためにいくつかの評判ポイントを得るでしょう。 – jfriend00