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