你如何可选地处理Javascript承诺中的错误?

我正在使用node.js中的Promises(使用Q库)。 我已经将所有基于callback的代码移植到了Promise中,而且一切都很顺利。 但是,我似乎还有一个模式,我觉得这个模式似乎在继续执行。 我觉得可能有更好的方法来处理这个问题,但我并不确定是什么。

基本上,如果你有可能从asynchronous操作中得到一个错误,你可能会也可能不能在本地处理它。 例如,处理某种types的错误,并传播其余的。 在基于callback的代码中,我会做这样的事情:

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的背景,在这里重新抛出这样的exception基本上是一个可燃的进攻。 但是,也许在JavaScript中并不重要? 或者,有没有办法写这个我不知道的代码?

也许在JavaScript中并不重要?

的确,这并不重要。 反思并不是一个坏习惯,堆栈跟踪(如果可以在asynchronous环境中使用)不会受到它的伤害。

JS没有办法有条件地根据它们的types来捕获exception,你总是要抓住它们。 一些承诺库, 特别是Bluebird ,虽然提供错误模式匹配的语法糖。

有没有办法写这个代码,我不知道?

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

 return Promise.reject(err);