Стратегия возврата с использованием рекурсивных функций и обещаний
Почти уверен, что я испортил свои обещания, но это происходит, прежде чем моя голова взорвется
Я пытаюсь реализовать механизм повторных попыток для моих UnprocessedItems после пакетной операции с использованием AWS DynamodB. У меня есть массив пакетов, которые я хочу записать в базу данных.
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, обещание заканчивается. data = [[r1], null, null, [r4]]
Я полагаю, что неправильно использую вызовы с обещаниями при использовании рекурсивности, но пока не могу понять.