Вы не отвергаете родителя, вы только что создали новое вложенное отклоненное обещание, а затем сразу же выбросили его.
Вот как вы можете переписать это:
const parent = new Promise((res, rej) => {
// nested reject
Promise.reject("A plain reject").then(res, rej);
});
Это все еще плохая картина. Вы действительно должны стараться избегать new Promise
, если можете. Трудно действительно сказать вам, как правильно написать это, не видя более реалистичного примера, потому что вышеприведенное можно переписать как:
const parent = Promise.reject("A plain reject");
Редактировать ответ на ваше наблюдение:
Обновление: я не пытаюсь переписать это, когда родитель ловит отклоненное обещание. Я просто хочу понять, почему? Спасибо!
Когда вы throw
исключение, это языковая функция, которая останавливает текущую функцию и всплывает исключение, пока что-то в стеке вызовов не получит catch
.
Когда вы пишете заявление вроде:
Promise.reject('foo');
Вы:
- Вызовите функцию
reject()
для объекта Promise
.
- Отменить результат.
Даже при том, что здесь (создается) обещание создается, вы ничего не делаете с результатом. Это то же самое, что вызов функции, но затем ничего не делать с тем, что было returned
, и задаться вопросом, куда ушел результат.
Итак, ваш первоначальный пример:
var parent = new Promise((res, rej) => {
// this DOES NOT get caught by the parent.
Promise.reject("A plain reject");
// this gets caught by the parent
// throw new Error("Arbitrary error");
});
фактически то же самое, что и:
var parent = new Promise((res, rej) => {
// this DOES NOT get caught by the parent.
true;
});
или
var parent = new Promise((res, rej) => {
// this DOES NOT get caught by the parent.
5;
});
или
var parent = new Promise((res, rej) => {
// this DOES NOT get caught by the parent.
"hello".indexOf('h');
});
Строка выполняется, но она «бессмысленна», поскольку не имеет побочных эффектов.