Стратегия возврата с использованием рекурсивных функций и обещаний

Почти уверен, что я испортил свои обещания, но это происходит, прежде чем моя голова взорвется

Я пытаюсь реализовать механизм повторных попыток для моих 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]]

Я полагаю, что неправильно использую вызовы с обещаниями при использовании рекурсивности, но пока не могу понять.

0 ответов

Другие вопросы по тегам