如何选择性地处理Javascript承诺中的错误

How do you optionally handle an error in a Javascript promise?

本文关键字:承诺 错误 Javascript 处理 选择性      更新时间:2023-09-26

我正在node.js中学习Promises(使用Q库)。我已经将所有基于回调的代码移植到Promises,一切似乎都很好。然而,有一种模式我似乎一直在实施,我觉得这是可疑的。我觉得可能有更好的方法来处理这个问题,但实际上我不确定是什么。

基本上,如果您有可能从异步操作中获得错误,并且您可能无法在本地处理它。例如,处理某类错误,并传播其余错误。在基于回调的代码中,我会做一些类似的事情:

fs.readFile(path, 'utf-8', function (err, data) {
    if(err) {
        if(err.code == "ENOENT") {
            cb(null, null); //it's fine to return null and eat the error
        } else {
            cb(err, null); //this is probably not fine, so barf
        }
        return;
    }
    ...
});

在基于Promise的代码中,这变成了:

return fs.readFile(path, 'utf-8').then( function(data) { ... }, function(err) {
    if(err.code == "ENOENT") {
        return null; //it's fine to return null and eat the error
    }
    throw err; //this is probably not fine, so barf 
});

我不喜欢的部分是重新抛出错误。我来自.NET背景,在那里,重新抛出这样的异常基本上是一种可以攻击的行为。然而,也许在JavaScript中这并不重要?或者,有没有一种方法可以编写我不知道的代码?

也许在JavaScript中这没关系?

事实上,这并不重要。重试并不是一种糟糕的做法,堆栈跟踪(如果在异步环境中可用的话)也不会受到影响

JS没有办法根据异常的类型有条件地捕获异常,您总是必须捕获所有异常。一些promise库,特别是Bluebird,确实为错误的模式匹配提供了语法糖。

有没有一种方法可以编写我不知道的代码?

如果你不喜欢throw关键字,或者担心它会伤害你的异常对象(它不应该),你可以使用等效的

return Promise.reject(err);