Необработанный отказ от обещания, несмотря на то, что он получил обещание - PullRequest
0 голосов
/ 19 сентября 2018

Я не понимаю ... Это я или это ошибка в узле?

Это нормально, как и ожидалось:

const a = new Promise((resolve, reject) => {
  setTimeout(() => reject('timeout'), 1000);
});
a.catch(console.log);

И это выдает предупреждение:

const a = new Promise((resolve, reject) => {
  setTimeout(() => reject('timeout'), 1000);
});
a.then(console.log);
a.catch(console.log);

Я получаю

timeout
(node:40463) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): timeout
(node:40463) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Ответы [ 3 ]

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

Аннотированный и слегка измененный источник:

// promise A is created
const a = new Promise((resolve, reject) => {
  setTimeout(() => reject('timeout'), 1000);
});

// promise A is chained with .then()
// means new promise is created
// and only resolve catched here
const aThenPromise = a.then(console.log);

// promise A is chained with .catch()
// means new promise is created
// and only reject catched here
const aCatchPromise = a.catch(console.log);

// aThenPromise !== aCatchPromise

При отклонении обещания a:

  • aCatchPromise работает, как ожидается, и timeout регистрируется на консоли
  • aThenPromise ничего не делает, так как он работает только с resolve(), и через него передается отклонение, а не обрабатывается , потому что это другое обещание .Это приводит к UnhandledRejection

Вам необходимо добавить улов к aThenPromise,

Один из возможных вариантов - a.then(console.log).catch(console.log), он будет обрабатывать отклонение, пройденное через .then

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

Использование .then(...) с обещанием возвращает новое обещание (это называется цепочка ).Поэтому, когда вы делаете что-то вроде:

a.then(console.log); // line 1 creates a new promise "b"
a.catch(console.log); // line 2 handles rejection on promise "a"

, где a - ваше первоначальное обещание, вы создаете новое обещание в строке 1 (то, которое больше не a. Давайте назовем его b).Поэтому, даже если вы используете .catch(...) с a, вы не обрабатываете отклонение на b, что объясняет сообщение, которое вы видите на консоли.

Чтобы избежать этого сообщения, выследует добавить .catch(...) к этому новому обещанию b в строке 1

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

Обещай работать как цепочка действий, если ты несмотря на действие, это не сработает.

a.then(console.log).catch(console.log);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...