Как вернуть Обещание в Promise.all (). Promise.all () возвращает обещание - PullRequest
0 голосов
/ 23 апреля 2020

Мой вопрос прост. Promise.all() метод может вернуть Promise? Позвольте мне объяснить:

function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    Promise.all(queue)
        .then(() => return Promise.resolve())
        .catch(err => {
            return Promise.reject(err);
        });    
}

С помощью этой функции я хочу отклонить ошибку, если один из Promise из queue отклонен. На самом деле, у меня есть ошибка "необработанное отклонение" , и я думаю, что из-за этого. Итак, я пытаюсь что-то еще.

async function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    try {
        await Promise.all(queue);
        return Promise.resolve();
    } catch (error) {
        return Promise.reject(err);
    }  

После этого изменения у меня снова возникает эта проблема, но я думаю, что второй способ верен, но я не понимаю, почему он не работает.

Спасибо за ваше время.

1 Ответ

1 голос
/ 23 апреля 2020

Проблема в том, что вы

return Promise.reject(err);

в обоих фрагментах. Это приводит к отклоненному Обещанию, к которому все это разрешается, и если этот отказ нигде не обрабатывается, вы получите предупреждение «необработанный отказ».

Если потребителю simpleFunction необходимо использовать Обещание, убедитесь, что оно также перехватывает его, и убедитесь, что return вызов Promise.all.

Нет необходимости заключать вызов Promise.all в .then и catch, Вы можете просто вернуть Promise.all сам. Это создаст Обещание, которое отклонит, если какое-либо из Обещаний в массиве отклонит, что вам нужно:

function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    return Promise.all(queue);
}
simpleFunction()
  .catch((err) => {
    // handle errors
  });

Или, если потребитель не использует Обещание, тогда .catch in simpleFunction, но не создавайте отклоненное обещание , просто обработайте ошибку (или проигнорируйте ее в catch, хотя это не очень хорошая идея):

function simpleFunction() {
    let queue = [];
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);
    queue.push(*PROMISE1*);

    Promise.all(queue)
      .catch((err) => {
        // handle errors here
        // do NOT call `Promise.reject`,
        // because then the rejection will be unhandled
      });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...