几乎可以肯定我搞砸了我的承诺,但在此之前,我的头脑爆炸了
我尝试在使用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调用,但我还无法弄明白。