Я хочу быть в состоянии поймать исключение, заброшенное внутри обещания, вне функции этого обещания. Смотрите следующий код:Как уловить внутреннее исключение?
throwError =() => {
throw new Error("myError");
};
let iWantToCatchTheErrorThatThisOneThrows =() => {
return (new Promise((resolve) => {
resolve()
}).then(() => {
(new Promise((resolve, reject) => {
return throwError();
}));
return new Promise((resolve) => setTimeout(resolve, 1000));
})).catch((error) => {
//Never reaches here
console.log(error)
});
};
iWantToCatchTheErrorThatThisOneThrows().then(() => {
console.log("Quit gracefully");
}).catch((error) => {
//Never reaches here
console.log(error);
});
я могу поймать внутреннюю ошибку, но я не могу бросить его в конечном итоге, где я хочу (в конце концов), путем добавления задвижки в середине:
let iWantToCatchTheErrorThatThisOneThrows =() => {
return (new Promise((resolve) => {
resolve()
}).then(() => {
(new Promise((resolve, reject) => {
return throwError();
})).catch((error) => {
//Prints, but thrown error isn't bubbled anywhere
console.log(error);
throw new Error(error);
});
return new Promise((resolve) => setTimeout(resolve, 1000));
})).catch((error) => {
//Never reaches here
console.log(error)
});
};
iWantToCatchTheErrorThatThisOneThrows().then(() => {
console.log("Quit gracefully");
}).catch((error) => {
//Never reaches here
console.log(error);
});
Все тесты выполняются в Nodejs 7.1.0
Во внутреннем обратном вызове вы делаете все виды метания и повторного броска, а затем возвращаете несвязанное, разрешенное обещание. Не должно быть удивления, что внешнему '.catch()' нечего ловить. –