为什么 JavaScript Promises 有时既不使用 .catch 也不使用 .then?
Why would JavaScript Promises sometimes neither use .catch nor use .then?
这可能是一个有无数答案的问题,否则您将需要查看我的实际代码来帮助我。我所看到的行为可能只有一个原因(或少数原因)。第一个问题:它是什么?如果是前者,我会撤回这个问题,这样人们就不会浪费时间了。我无法共享代码,而且它的长度超出了这里的适当范围。
我在 Node.JS 中使用 bluebird for Promises 编写 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) });
在适合此模型的代码的 某些 部分中,我看到了其中一个日志语句的结果。在适合此模型的代码的 other 部分中,我都没有看到。在后面的部分中,当我使用调试器跟踪执行路径时,在它以 a
完成后,它将绿色高亮显示在 .catch(error => {
中的 (error
和 next
上 }
关闭包含 a
、其 .then
及其 .catch
和 next
(在通过一些蓝鸟代码后)的 Promise }
关闭包含相同 Promise 的函数。
JSHint 未识别任何相关内容。
我在使用本机 Promises 时看到了非常相似的行为。然后我通过替换 bluebird Promises 解决了它。现在我看到蓝鸟也在做同样的事情,虽然在不同的地方。
如果这是一个已知且易于描述的原因,我将非常感谢您的帮助。如果它比那个大,这个问题可能不属于 Stack Overflow;我撤了
提前致谢。
好的,让我们从完全不同的事情开始。 Chances are you should never be using the promise constructor, ever。
promise 构造函数用于将非 promise 返回的内容转换为 promise 返回的内容。如果您使用的是 bluebird,您应该使用 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; })
既然您使用的是 bluebird 和现代 Node - 我可以建议您看一下生成器吗? http://bluebirdjs.com/docs/api/promise.coroutine.html
这可能是一个有无数答案的问题,否则您将需要查看我的实际代码来帮助我。我所看到的行为可能只有一个原因(或少数原因)。第一个问题:它是什么?如果是前者,我会撤回这个问题,这样人们就不会浪费时间了。我无法共享代码,而且它的长度超出了这里的适当范围。
我在 Node.JS 中使用 bluebird for Promises 编写 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) });
在适合此模型的代码的 某些 部分中,我看到了其中一个日志语句的结果。在适合此模型的代码的 other 部分中,我都没有看到。在后面的部分中,当我使用调试器跟踪执行路径时,在它以 a
完成后,它将绿色高亮显示在 .catch(error => {
中的 (error
和 next
上 }
关闭包含 a
、其 .then
及其 .catch
和 next
(在通过一些蓝鸟代码后)的 Promise }
关闭包含相同 Promise 的函数。
JSHint 未识别任何相关内容。
我在使用本机 Promises 时看到了非常相似的行为。然后我通过替换 bluebird Promises 解决了它。现在我看到蓝鸟也在做同样的事情,虽然在不同的地方。
如果这是一个已知且易于描述的原因,我将非常感谢您的帮助。如果它比那个大,这个问题可能不属于 Stack Overflow;我撤了
提前致谢。
好的,让我们从完全不同的事情开始。 Chances are you should never be using the promise constructor, ever。
promise 构造函数用于将非 promise 返回的内容转换为 promise 返回的内容。如果您使用的是 bluebird,您应该使用 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; })
既然您使用的是 bluebird 和现代 Node - 我可以建议您看一下生成器吗? http://bluebirdjs.com/docs/api/promise.coroutine.html