Непонятный Unhandled promise rejection
Немогу понять, почему поведение разное.
В таком варианте все работает, как ожидалось: const debug = require("debug")("m"); const promise = new Promise((resolve, reject) => { setTimeout(() => { reject("promise rejected"); }, 1000); }); promise.then( v => { debug("resolve", v); }, e => { debug("reject", e); }, ); Ставлю catch вместо обработчика reject const debug = require("debug")("m"); const promise = new Promise((resolve, reject) => { setTimeout(() => { reject("promise rejected"); }, 1000); }); promise.then(v => { debug("resolve", v); }); promise.catch(e => { debug("catch: ", e); return; }) работает так же, но nodejs кричит UnhandledPromiseRejectionWarning. Как понимать этот варнинг? |
Цитата:
promise.then(v => { debug("resolve", v); }, e => { throw e; }); в итоге промис, созданный этим then, будет отклоненный. Именно он и вываливает ошибку, т.к. для него нет вызова then или catch (тот catch, который идет далее, вызывается на исходном промисе). А в первом случае в then вторым аргументом попадала функция, которая не реджектила, в итоге then возвращал зарезолвленный промис. |
Круто.
Т.е. если промис может реджектиться, то надо, либо then делать с двумя параметрами, либо далеть цепочку then...catch, чтобы отловить отклоненные промисы, возвращенные этими 'неявными' функциями (кстати, отсутствие onFulfilled функции в then в такой же ситуации никаких варнингов не вызывает). А где в стандарте описана эта ситуация с неявной подстановкой второго параметра, никак не могу найти. |
Цитата:
Это скорее "возможная реализация". В стандарте о заменах не упоминается, но указано, что должно получиться в итоге. https://promisesaplus.com/ пп. 2.2.7.3 и 2.2.7.4, что достигается, например, при таких заменах. |
Часовой пояс GMT +3, время: 23:19. |