一尘不染

如何处理承诺中的错误?

node.js

作为节点程序员。我习惯于使用“ 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处理这种错误?


阅读 221

收藏
2020-07-07

共1个答案

一尘不染

经验法则

每当您对如何使用Promise有所疑问时,请考虑一下同步版本。

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

至少对我来说,这比第一个参数有时是的回调要干净得多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);
        })
    });
};

使用回调/ nodebacks

这只是在使用回调时应做的事情,在使用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自己。

另外,还要考虑读这个那个,详细了解承诺的错误处理。

2020-07-07