作为节点程序员。我习惯于使用“ nodebacks”来处理代码中的错误:
myFn(param, function(err, data) {
if (err){
//error handling logic
}
else {
// business logic
}
});
编写该函数时,我可以做类似的事情:
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
});
};
我如何用诺言进行这种错误处理?
[每当您对如何使用Promise存有疑问时,请考虑同步版本。
try{
var result = myFn(param);
// business logic with result
} catch(e) {
//error handling logic
}
至少在我看来,这比第一个参数有时为null
的回调要干净得多。
promise方法几乎总是与问题的同步版本非常相似:
myFn(param).then(function(result){
// business logic with result
}).catch(function(e){
//error handling logic
});
使用回调时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);
})
});
};
这只是在使用回调时应做的事情,在使用promise时则要简单得多,并且可以执行以下操作:
var myFn = function(param){
var calc = doSomeCalculation(param);
...
return someAsyncOp(calcN); // returning a promise.
}
此外,当在诺言链中工作时,您将获得抛出安全性:
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
});
注意,某些库,例如Bluebird,RSVP和Q提供语法糖和方法的自动组合,因此您很少需要自己使用new Promise
。
如果使用异步/等待语法,则可以仅使用常规try-catch语法进行错误处理。
// your promise function
const myFn = function(param){
return new Promise(function(resolve, reject){
if (someLogic()) {
resolve(someValue);
} else {
reject('failure reason');
}
});
}
// Define the parent function as an async function
async function outerFn(param) {
try {
// Wait for the promise to complete using await
const result = await myFn(param)
// business logic with result
} catch (e) {
//error handling logic
}
}