Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2017, 17:01
Новичок на форуме
Отправить личное сообщение для tilin Посмотреть профиль Найти все сообщения от tilin
 
Регистрация: 14.08.2017
Сообщений: 2

Непонятный 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. Как понимать этот варнинг?
Ответить с цитированием
  #2 (permalink)  
Старый 14.08.2017, 17:46
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от tilin Посмотреть сообщение
Ставлю 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. Как понимать этот варнинг?
На самом деле then здесь неявно получает второй параметр, и полностью выглядит так:
promise.then(v => {
	debug("resolve", v);
},
e => {
        throw e;
});


в итоге промис, созданный этим then, будет отклоненный. Именно он и вываливает ошибку, т.к. для него нет вызова then или catch (тот catch, который идет далее, вызывается на исходном промисе).

А в первом случае в then вторым аргументом попадала функция, которая не реджектила, в итоге then возвращал зарезолвленный промис.

Последний раз редактировалось Alexandroppolus, 14.08.2017 в 17:53.
Ответить с цитированием
  #3 (permalink)  
Старый 14.08.2017, 20:56
Новичок на форуме
Отправить личное сообщение для tilin Посмотреть профиль Найти все сообщения от tilin
 
Регистрация: 14.08.2017
Сообщений: 2

Круто.

Т.е. если промис может реджектиться, то надо, либо then делать с двумя параметрами, либо далеть цепочку then...catch, чтобы отловить отклоненные промисы, возвращенные этими 'неявными' функциями (кстати, отсутствие onFulfilled функции в then в такой же ситуации никаких варнингов не вызывает).

А где в стандарте описана эта ситуация с неявной подстановкой второго параметра, никак не могу найти.
Ответить с цитированием
  #4 (permalink)  
Старый 21.08.2017, 11:18
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от tilin Посмотреть сообщение
А где в стандарте описана эта ситуация с неявной подстановкой второго параметра, никак не могу найти.
правильнее сказать: "должно работать, как если бы на месте отсутствующей функции была функция e => throw e". Аналогичное, кстати, справедливо и для первого параметра then - там подставляется e => e

Это скорее "возможная реализация". В стандарте о заменах не упоминается, но указано, что должно получиться в итоге. https://promisesaplus.com/ пп. 2.2.7.3 и 2.2.7.4, что достигается, например, при таких заменах.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свой Promise Nexus Ваши сайты и скрипты 4 14.08.2017 14:17
Порядок выполнения функций с Promise и без. Даниленко Денис Общие вопросы Javascript 0 29.04.2017 12:33
Как асинхронно вызвать resolve() вне Promise? Malleys Общие вопросы Javascript 8 18.12.2016 08:00
Promise как сделать синхронным? FireVolkhov Angular.js 3 07.04.2015 16:36