为什么JavaScript Promises有时既不使用.catch也不使用.then?

时间:2016-02-12 17:26:46

标签: javascript node.js promise bluebird

这可能是一个有很多答案的问题,或者你需要看到我的实际代码来帮助我。对于我所看到的行为,可能有一个原因(或少数原因)。第一个问题:这是什么?如果是前者,我会撤回问题,这样人们就不会浪费时间。我不能分享这些代码,而且它比适当的时间更长。

我正在使用bluebird for Promises在Node.JS中编写JavaScript。我的部分代码适合这个模型。

const Promise = require('bluebird');
function a() {
  return new Promise(function(resolve, reject) {
    <... do something>
    <either> return resolve();
    <or> return reject();
  })
}

a()
.catch(error => { console.log('Used .catch   error=', error) })
.then(result => { console.log('Used .then   result=', result) });

在符合此模型的代码的部分部分中,我看到了其中一个日志语句的结果。在我的代码的其他部分适合这个模型,我也看不到。在后面的部分中,当我使用调试器跟踪执行路径时,在使用a完成后,它将绿色突出显示在(error上的.catch(error => {next}上。 1}}在a结束时关闭包含.then,其.catch及其next}(经过一些蓝鸟代码)的承诺包含相同Promise的函数。

JSHint没有识别任何相关内容。

当我使用本机Promise时,我看到了非常相似的行为。我解决了它,然后代替bluebird Promises。现在我看到蓝鸟在不同的地方做同样的事情。

如果这是一个已知且易于描述的原因,我将非常感谢您的帮助。如果它大于那个,这个问题可能不属于Stack Overflow;我会撤回它。

提前致谢。

1 个答案:

答案 0 :(得分:5)

好的,让我们从一些完全不同的东西开始吧。 Chances are you should never be using the promise constructor, ever

promise构造函数用于将非承诺返回的东西转换为承诺返回的东西。如果你正在使用蓝鸟,你应该使用Promise.promisifyAll为你快速有效地做到这一点。

承诺是让你的生活更容易而不是更难。写一大堆样板将击败这个目的。错误地转换回调API可能会导致一些令人沮丧的事情。这很难做到 - 例如,promise构造函数完全忽略return值。

您的代码使用catch 从错误中恢复。有点像:

try {
    var result = doSomething();
} catch (error) {
   console.log('Used .catch   error=', error);
}
console.log('Used .then   result=', result);

使用.catch表示您从错误中恢复。这意味着您的代码可以优雅地处理异常情况。如果您需要在catch中发信号通知您的代码从错误中恢复 - 您需要重新抛出异常:

.catch(e => { console.log("Got ", e); throw e; })

既然你正在使用蓝鸟和现代节点 - 我可以建议你看一下发电机吗? http://bluebirdjs.com/docs/api/promise.coroutine.html