我如何处理承诺的错误?

作为节点程序员。 我习惯于使用“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 }); }; 

我将如何做这种承诺的error handling?

经验法则

每当你对如何做承诺有疑问 – 想想同步版本。

 try{ var result = myFn(param); // business logic with result } catch(e) { //error handling logic } 

这个,至less对我来说,看起来比第一个参数有时为null的callback更清洁。

承诺的方式几乎总是非常相似的问题的同步版本:

 myFn(param).then(function(result){ // business logic with result }).catch(function(e){ //error handling logic }); 

myFn在使用callback函数时会看起来像什么:

 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); }) }); }; 

使用callback/节点

这只是在处理callback时必须要做的事,在处理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 }); 

注意,一些像BluebirdRSVPQ这样的库提供语法糖和方法的自动promisification,所以你很less必须自己使用new Promise

另外,请考虑阅读本文 ,了解有关承诺error handling的更多信息。