1

几乎可以肯定我搞砸了我的承诺,但它就这样,在我的头爆炸之前

我正在尝试在使用 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 没有任何 UnprocessedItems 时,一切正常。但是当需要重试时,我会准确地为那些在第一次运行中有一些 UnprocessedItems 的批次获取空值:例如,如果批次 2 和 3 导致一些 UnprocessedItems 则 promise.all 以data = [[r1], null, null, [r4]]

我想我在使用递归时错误地处理了 Promise 调用,但我还想不通。

4

0 回答 0