Хорошо, давайте возьмем более простой случай:
new Promise((resolve, reject) => {
setTimeout(() => { throw new Error(); });
});
Что приводит к сбою процесса. Причина в том, что setTimeout
(или request
в вашем случае) подписывается на обратный вызов для последующего вызова .
Когда обратный вызов в конце концов вызывается - конструктор обещания уже выполняется, и ошибка выдается в текущий контекст (setTimeout / request's).
Причина, по которой конструктор обещает синхронно ловить ошибки, заключается в том, что он в основном делает это:
try {
executor(resolve, reject); // your code
} catch (e) {
reject(e);
}
Поскольку в вашем случае функция не выполняется синхронно - у нее нет возможности узнать о контексте исключения. Это может измениться в будущем с Зонами, но, вероятно, не изменится.
Если вы хотите пометить ошибку внутри обещанной функции - вы можете вызвать второй аргумент (reject
) и reject(new Error(...))
.
Я настоятельно рекомендую использовать util.promisify
вместо того, чтобы вручную преобразовывать API в обещания, чтобы избежать подобных проблем:)
Я также рекомендую отклонять только объекты Error
для лучшей трассировки стека.