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

Bal*_*gle 2 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) });
Run Code Online (Sandbox Code Playgroud)

在我的代码的某些部分拟合这个模型,我看到一个日志语句的结果.在我的代码的其他部分适合这个模型,我也看不到.在后面的部分,当我跟踪执行路径与调试,它完成之后a,它把绿色的亮点就(error.catch(error => {next}合包含无极a,它.then和它的.catch,并next在(后通过一些蓝鸟代码会)}闭幕包含相同Promise的函数.

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

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

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

提前致谢.

Ben*_*aum 5

好吧,让我们从完全不同的东西开始吧.有可能你永远不应该使用promise构造函数.

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);
Run Code Online (Sandbox Code Playgroud)

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

.catch(e => { console.log("Got ", e); throw e; })
Run Code Online (Sandbox Code Playgroud)

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