2016-08-17 3 views
0

코드 아래에이 코드가 있지만 widgetsAddCall이 배열에 추가 되 자마자 실행되고 promise.each는 사용되지 않습니다.Bluebird async series 호출

함수 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

나는 각각의 호출 다른 후 데이터를 하나의 덩어리를 보내도록하는 API 호출이 다른 후 하나를 만들어합니다.

나는 모든 통화를 직렬화하는 생각할 수있는 가장 간단한 방법은 배열로 덩어리를 사전 빌드 후 블루 버드의 Promise.mapSeries()가 직렬로 배열을 반복하는 데 사용할 수 있습니다 : 참고로

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