Ben*_*aum 22 javascript error-handling node.js promise bluebird
作为节点程序员.我习惯使用"nodebacks"来处理我的代码中的错误:
myFn(param, function(err, data) {
if (err){
//error handling logic
}
else {
// business logic
}
});
Run Code Online (Sandbox Code Playgroud)
在编写该函数时,我可以执行以下操作:
var myFn = function(param, callback){
var calc = doSomeCalculation(param);
if(calc === null) { // or some other way to detect error
callback(new Error("error with calculation"), null);
}
...
someAsyncOp(calcN,function(err, finalResult){
if(err) return callback(err, null);
callback(null, finalResult); // the error is null to signal no error
});
};
Run Code Online (Sandbox Code Playgroud)
我如何使用promises进行这种错误处理?
Ben*_*aum 40
每当你对如何用promises做某事表示怀疑时 - 想想同步版本.
try{
var result = myFn(param);
// business logic with result
} catch(e) {
//error handling logic
}
Run Code Online (Sandbox Code Playgroud)
至少对我而言,这看起来要比使用第一个参数的回调更清晰null.
承诺方式几乎总是非常类似于问题的同步版本:
myFn(param).then(function(result){
// business logic with result
}).catch(function(e){
//error handling logic
});
Run Code Online (Sandbox Code Playgroud)
myFn在使用回调时看起来像什么:
var myFn = function(param){
return new Promise(function(resolve, reject){
var calc = doSomeCalculation(param);
if(calc === null) { // or some other way to detect error
reject(new Error("error with calculation"), null);
}
someAsyncOp(calcN,function(err, finalResult){
if(err) reject(err);
resolve(finalResult);
})
});
};
Run Code Online (Sandbox Code Playgroud)
这只是你在使用回调时应该做的事情,当使用promises时它更简单,你可以这样做:
var myFn = function(param){
var calc = doSomeCalculation(param);
...
return someAsyncOp(calcN); // returning a promise.
}
Run Code Online (Sandbox Code Playgroud)
此外,在承诺链内部工作时,您可以获得安全性:
myFn(param).then(function(calcN){
// here, you throw to raise an error and return to resolve
// new Promise should be used only when starting a chain.
}).catch(function(err){
// handle error
}).then(function(){
// ready to go again, we're out of the catch
});
Run Code Online (Sandbox Code Playgroud)
请注意,一些像Bluebird,RSVP和Q这样的库提供语法糖和方法的自动授权,因此您很少使用new Promise自己.