Да!!
Распространение ошибок в промисах — одна из его сильных сторон. Он действует точно так же, как в синхронном коде.
try {
throw new Error("Hello");
} catch (e){
console.log('Caught here, when you catch an error it is handled');
}
Очень похоже на:
Promise.try(function(){
throw new Error("Hello");
}).catch(function(e){
console.log('Caught here, when you catch an error it is handled');
});
Так же, как и в последовательном коде, если вы хотите выполнить какую-то логику для ошибки, но не помечать ее как обработанную, вы повторно выдаете ее:
try {
throw new Error("Hello");
} catch (e){
console.log('Caught here, when you catch an error it is handled');
throw e; // mark the code as in exceptional state
}
Что становится:
var p = Promise.try(function(){
throw new Error("Hello");
}).catch(function(e){
console.log('Caught here, when you catch an error it is handled');
throw e; // mark the promise as still rejected, after handling it.
});
p.catch(function(e){
// handle the exception
});
Обратите внимание, что в Bluebird у вас могут быть типизированные и условные перехваты, поэтому, если все, что вы делаете, это if
для типа или содержимого промиса, чтобы решить, обрабатывать его или нет - вы можете сохранить это.
var p = Promise.try(function(){
throw new IOError("Hello");
}).catch(IOError, function(e){
console.log('Only handle IOError, do not handle syntax errors');
});
Вы также можете использовать .error
для обработки OperationalError
, которые происходят из обещанных API. В общем случае OperationalError
означает ошибку, от которой можно избавиться (в отличие от ошибки программиста). Например:
var p = Promise.try(function(){
throw new Promise.OperationalError("Lol");
}).error(function(e){
console.log('Only handle operational errors');
});
Преимущество этого заключается в том, что в вашем коде не замалчиваются TypeError
или синтаксические ошибки, которые могут раздражать в JavaScript.
person
Benjamin Gruenbaum
schedule
30.07.2014
Promise
. Для этого нет абсолютно никаких причин. Чего вы пытаетесь достичь? - person Bergi   schedule 30.07.2014throw error2
в обработчике catch иresolve1()
внешнее обещание вместе с ним. - person Bergi   schedule 30.07.2014