为什么JavaScript承诺有时既不使用。捕获也不使用。那么?

为什么JavaScript承诺有时既不使用。捕获也不使用。那么?,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,这可能是一个有无数答案的问题,否则您需要查看我的实际代码来帮助我。我所看到的行为可能有一个原因(或少数原因)。第一个问题:是哪一个?如果是前者,我会撤回这个问题,这样人们就不会浪费时间了。我无法共享代码,而且它的长度超出了此处的适用范围 我正在Node.JS中编写JavaScript,使用bluebird作为承诺。我的部分代码适合这个模型 const Promise = require('bluebird'); function a() { return new Promise(functi

这可能是一个有无数答案的问题,否则您需要查看我的实际代码来帮助我。我所看到的行为可能有一个原因(或少数原因)。第一个问题:是哪一个?如果是前者,我会撤回这个问题,这样人们就不会浪费时间了。我无法共享代码,而且它的长度超出了此处的适用范围

我正在Node.JS中编写JavaScript,使用bluebird作为承诺。我的部分代码适合这个模型

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) });
const Promise=require('bluebird');
函数a(){
返回新承诺(功能(解决、拒绝){
返回resolve();
返回拒绝();
})
}
()
.catch(错误=>{console.log('Used.catch错误=',error)})
.then(result=>{console.log('Used.then result=',result)});
在适合此模型的代码的某些部分中,我看到了其中一条log语句的结果。在我的代码的其他部分中,我发现这两个模型都不适用。在后面的部分中,当我使用调试器跟踪执行路径时,在调试器使用
a
完成后,它将绿色高亮显示在
(error
.catch中(error=>{
下一个
}
关闭一个包含
a
、其
、其
、其
、其
、catch
、和
next
(经过一些蓝鸟代码后)的承诺
关闭一个包含相同承诺的函数

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

当我使用本地承诺时,我看到了非常相似的行为。我通过替换蓝鸟承诺解决了这个问题。现在我看到蓝鸟也这样做,尽管在不同的地方

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


提前谢谢。

好的,让我们从完全不同的东西开始

promise构造函数用于将未承诺返回的内容转换为承诺返回的内容。如果您使用的是bluebird,则应该使用
promise.promisifyAll
来快速高效地完成此操作

承诺是为了让你的生活变得更轻松而不是更困难。编写大量的样板文件将无法达到这一目的。可能是由于错误地转换回调API导致了一些挫折。这很难做到正确-例如,承诺构造函数完全忽略
返回值

您的代码使用从错误中恢复的
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和modern Node,我可以建议您看看生成器吗?

您的问题是“为什么要编写不返回的异步代码?”?后端触发器可能不需要返回,例如记录用户的操作。不,谢谢。这更像是:如果调用包含承诺的函数(
a
),执行路径不应该总是经过相应的
。然后
返回解析()之后并始终通过适当的<代码> .catch >代码> >代码>返回拒绝()/>代码>有些人会认为这比问答更像讨论。你可以考虑加入我吗?我很乐意选择你的大脑!