作为节点程序员。我习惯于使用“ 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 }); };
我如何用promises处理这种错误?
每当您对如何使用Promise有所疑问时,请考虑一下同步版本。
try{ var result = myFn(param); // business logic with result } catch(e) { //error handling logic }
至少对我来说,这比第一个参数有时是的回调要干净得多null。
null
promises方式几乎总是与问题的同步版本非常相似:
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); }) }); };
这只是在使用回调时应做的事情,在使用promises时要简单得多,并且可以执行以下操作:
var myFn = function(param){ var calc = doSomeCalculation(param); ... return someAsyncOp(calcN); // returning a promise. }
此外,当在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自己。
new Promise
另外,还要考虑读这个和那个,详细了解承诺的错误处理。