蓝鸟异步系列电话

时间:2016-08-17 18:32:43

标签: node.js asynchronous bluebird

我有以下代码,但是一旦将widgetsAddCall添加到数组中,它就会被执行,而promise.each是没用的。

函数widgetsAddCall向API服务器发出异步请求并返回bluebird promisified请求。我希望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);
            }
        });
    })

1 个答案:

答案 0 :(得分:0)

  

我希望API调用一个接一个地进行,以便每次调用   一个接一个地发送数据块。

我能想到的序列化所有调用的最简单方法是将块预先构建到一个数组中,然后使用Bluebird的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()