使用递归函数和promise的退避策略

时间:2017-02-22 10:09:48

标签: recursion promise amazon-dynamodb es6-promise exponential-backoff

几乎可以肯定我搞砸了我的承诺,但在此之前,我的头脑爆炸了

我尝试在使用aws dynamodb进行批处理操作后为我的UnprocessedItems实现重试机制。我有一堆批次要写入数据库。

var promiseList = []
batches.forEach(batch => {
    promiseList.push(save_batches(batch.params));
}

Promise.all(promiseList)
    .then(data => {
       console.log(data);
    });

实际保存数据的功能:

function save_batches(params){
  return Promise.resolve(save(params, MAX_ATTEMPTS));
}

function save(params, retry){
    return docClient.batchWrite(params).promise() //aws docClient object
         .then(data => {
              if("Unprocessed items found") && (retry > 0) {
                  params.RequestItems = data.UnprocessedItems;
                  sleep("for some time").then(() => {
                     return save(params, retry--); //recursive call
                  })
              }
              return data; //return if everything is ok or retry == 0 and there is nothing else to do
         });
}

调用Promise.all后的结果数据应该是结果列表: data = [[r1], [r2], [r3], [r4]] 当batchWrite没有任何UnprocessedItem时,一切正常。但是当需要重试时,我会继续为第一次运行中具有一些UnprocessedItems的批次精确获取空值:例如,如果批次2和3导致一些UnprocessedItems,则promise.all以data = [[r1], null, null, [r4]]结束

我想我在使用递归时错误地处理了promises调用,但我还无法弄明白。

0 个答案:

没有答案