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

Why would JavaScript Promises sometimes neither use .catch nor use .then?

本文关键字:then catch JavaScript Promise 为什么      更新时间:2023-09-26

这可能是一个有无数答案的问题,否则你需要看到我的实际代码来帮助我。我所看到的行为可能有一个原因(或少数原因(。第一个问题:是哪个?如果是前者,我会撤回这个问题,这样人们就不会浪费时间。我无法共享代码,无论如何它都比这里的适当时间长。

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

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 完成之后,它会在.catch(error => {中将绿色突出显示放在(error上,并在关闭包含a、其.then.catch的 Promise }next,并在关闭包含相同 Promise 的函数}next(在经历了一些蓝鸟代码之后(。

JSHint 不会识别任何相关内容。

当我使用原生承诺时,我看到了非常相似的行为。然后我通过替换蓝鸟承诺来解决它。现在我看到蓝鸟也在做同样的事情,尽管在不同的地方。

如果这是已知且易于描述的原因,我将非常感谢您的帮助。如果它比这更大,这个问题可能不属于堆栈溢出;我会撤回它。

提前谢谢。

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

promise

构造函数用于将不是 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);

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

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

既然你使用的是蓝鸟和现代节点 - 我可以建议看看生成器吗? http://bluebirdjs.com/docs/api/promise.coroutine.html