Отклонение обещания выполнено, но не выполнено (необработанный отказ от обещания) - PullRequest
0 голосов
/ 13 сентября 2018

Я новенькая, задавая вопросы.Я хорошо рассмотрел все остальные вопросы, которые были заданы, и изо всех сил пытался найти проблему, аналогичную той, которая у меня есть.Если есть похожий вопрос, мои извинения.

У меня проблемы с очень простым Обещанием, которое я создал для этого вопроса, где мне нужно отклонить цикл массива, где одна итерация одинакова:

var array = [1, 2, 3, 4, 5];
var promise = array.forEach(n => {
  new Promise((resolve, reject) => {
    if (n == 5) return reject();
    return resolve();
  });
});

Promise.all(promise).then(() => {
  console.log('true');
}).catch(() => {
  console.log('false');
});

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Всякий раз, когда вы обнаруживаете ошибку, вы должны правильно ее регистрировать, а не просто записывать false или что-то в этом роде.

Так что если вы напишите console.error(err); вместо console.log('false'), вы получитеошибка это что-то вроде TypeError: "can't convert undefined to object" или TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined для строки с Promise.all(promise).И это должно дать вам подсказку, что promise не содержит массив с Promises, но undefined.

promise равен undefined, поскольку forEach не возвращаетчто-нибудь.То, что вы ищете, это map.

Вьющиеся скобки вокруг вашего new Promise((resolve, reject) => {}) предотвращают возвращение new Promise, поэтому либо добавьте return передnew Promise или удалите эти фигурные скобки.

И вы всегда должны отклонять с фактической ошибкой, иначе вы не сможете получить правильную трассировку стека для ошибки.

var array = [1, 2, 3, 4, 5];
var promise = array.map(n => 
  new Promise((resolve, reject) => {
    if (n == 5) return reject(new Error('rejected for n==5'));
    return resolve();
  })
)

Promise.all(promise).then(() => {
  console.log('true');
}).catch(err => {
  console.error(err);
});
0 голосов
/ 13 сентября 2018

Array.prototype.forEach ничего не возвращает, поэтому promise равно undefined. Вместо этого следует использовать Array.prototype.map. Также обратите внимание, что вы действительно должны вернуть только что созданные обещания:

var array = [1, 2, 3, 4, 5];
var promise = array.map(n => {
  return new Promise((resolve, reject) => {
    if (n == 5) return reject();
    return resolve();
  });
});

Promise.all(promise).then(() => {
  console.log('true');
}).catch(() => {
  console.log('false');
});

Вы могли бы даже написать это так:

var promise = array.map(n => new Promise((resolve, reject) => (n == 5) ? reject() : resolve()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...