几乎可以肯定我搞砸了我的承诺,但它就这样,在我的头爆炸之前
我正在尝试在使用 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 调用,但我还想不通。