为什么 JavaScript Promise 有时既不使用 .catch 也不使用 .then
Why would JavaScript Promises sometimes neither use .catch nor use .then?
这可能是一个有无数答案的问题,否则你需要看到我的实际代码来帮助我。我所看到的行为可能有一个原因(或少数原因(。第一个问题:是哪个?如果是前者,我会撤回这个问题,这样人们就不会浪费时间。我无法共享代码,无论如何它都比这里的适当时间长。
我正在用 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
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- Javascript:If-then语句在函数中不起作用
- angularjs无法读取未定义的属性then
- errors with Javascript try catch
- 如何使用(this)访问Angular 2 http rxjs catch函数中的对象属性
- Promise函数在.then之后未运行函数化
- Javascript 承诺 .catch 仍然调用 final variable.then
- 为什么 JavaScript Promise 有时既不使用 .catch 也不使用 .then
- 在 AngularJS 中使用 then 和 catch 时出错
- 与茉莉花中 ES6 承诺的 then/catch 方法同步
- Factory - Then and Catch Promise Chaining in AngularJS
- Promise : then vs then + catch
- Jasmin Mock $http (then, catch)
- 如何从Promise's catch/then block返回
- 获取api - get json主体在then和catch块为单独的状态码
- 答应立刻处理.catch和.then
- javascript try catch vs if then else
- 如何测试' catch '和' then '与sinon js
- 有没有办法回报对.catch和.then的承诺
- 即使我在所有 then-able 中使用拒绝回调,我是否总是需要在最后需要 catch()