Реализация обещания Node.js предполагает, что отклоненное обещание будет синхронизировано с catch(...)
или then(..., ...)
, в противном случае появляется PromiseRejectionHandledWarning
. Отказ от необработанного обещания может привести к исключению в будущем.
Обычно отклонение следует рассматривать как любую другую ошибку, поэтому предпочтительно, чтобы это был экземпляр Error
, а не простая строка. Тогда это можно трактовать так:
class ExpectedRejection extends Error {}
var p3 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(new ExpectedRejection('three'))
}, 4000)
})
...
.then(function(p3result){
if (p3result instanceof ExpectedRejection)
throw p3result;
console.log('*********', p3result)
}).catch(function(err){
console.log("CaughtCathchError", err)
})
ExpectedRejection
класс специфичен и, возможно, не нужен; можно заменить на Error
везде, потому что Error
разрешения встречаются редко.
Это решение не очень распространено, потому что, если обещания создаются одновременно, они не зависят друг от друга и обычно могут обрабатываться с помощью Promise.all
:
Promise.all([p1, p2, p3])
.then(function(p1result, p2result, p3result){
console.log('*********', p3result)
}).catch(function(err){
console.log("CaughtCathchError", err)
});
Обратите внимание, что поскольку p1
, p2
и p3
являются задержками, которые создаются одновременно, в результате catch
будет запущено через 9 секунд (максимальная продолжительность задержки) в обоих случаях.