Javascript 在Bluebird中返回被拒绝的承诺和可能无法处理的拒绝处理程序

Javascript 在Bluebird中返回被拒绝的承诺和可能无法处理的拒绝处理程序,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我正在用这种模式编写大量代码,在Bluebird中可以找到一个类似的示例: 我的错误处理是这样完成的: Promise.all([ promise4 ]) .catch(function (err) { // handle error }); 问题是,如果promise3被拒绝,它将触发bluebird的onPossiblyUnhandledRejection处理程序,因为它在附加到任何承诺链(带有错误处理)之前被拒绝。这会导致在没有任何错误的情况下不断打印出大错误消息 我不知道该怎么

我正在用这种模式编写大量代码,在Bluebird中可以找到一个类似的示例:

我的错误处理是这样完成的:

Promise.all([
  promise4
])
.catch(function (err) {
  // handle error
});
问题是,如果promise3被拒绝,它将触发bluebird的onPossiblyUnhandledRejection处理程序,因为它在附加到任何承诺链(带有错误处理)之前被拒绝。这会导致在没有任何错误的情况下不断打印出大错误消息

我不知道该怎么办,因为一方面,上面的模式对于构造并发逻辑非常有用,而且非常容易理解,但另一方面,我不想简单地覆盖onPossiblyUnhandledRejection,因为如果我真的忘记处理某些事情,它可能会很有用

在某种程度上解决了这个问题,使其听起来好像上述模式是一个奇怪的模式:

“如果您的代码出于某种原因需要在某个承诺挂起一段时间后突然插入并将错误处理程序附加到该承诺上,那么您将看到恼人的消息”


我的“某些原因”是我需要构建高度并发的软件。这是我处理这类问题的基本缺陷吗?如果没有,在不完全删除这些警告的情况下,如何解决此问题?

正如我所评论的,您的代码工作正常,不会报告未处理的拒绝:

function promise3(value1, value2) {
    return Promise.reject(new Error("the error"))    
}
var promise1 = Promise.resolve();
var promise2 = Promise.resolve();
var promise4 = Promise.join(promise1, promise2, function (value1, value2) {
  // promise 3 needs the values resolved from promise1 and promise2
  return promise3(value1, value2);
});

Promise.all([promise4]).catch(function(error) {
    console.log(error.message === "the error")
});


更有可能的是,您忘记了某个地方的
return
语句,该语句是将承诺连接在一起并使链接(和错误传播)起作用所必需的。

请在代码中显示位置(和时间)实际上,您将错误处理程序附加到链上。因此,您的错误处理程序被调用,并且您大约同时获得未处理的拒绝事件?这听起来像一个bug。是的,这在我的应用程序中的许多地方都会发生,但是错误总是被成功捕获。如果它改变了任何东西,promise3可能会立即被拒绝,例如承诺。请尝试使用同步逻辑。@TomO'Connell我无法复制它-您能创建一个最小的测试用例(最好没有外部依赖项)吗重新创建问题?更新:这是OP没有在问题中发布的代码中的一个错误。我倾向于同意你的观点,因为我构建了自己的独立示例,没有看到问题。我还没有发现我的实际代码有任何错误。@TomO'Connell你能试着启用长堆栈跟踪并跟踪跟踪跟踪吗。例如,在这个JSFIDLE中,我忘记了返回,但是您可以跟踪记录的跟踪,看看它发生在哪里,只是尝试了这个。被拒绝的承诺在任何情况下都会被退回。仍在寻找原因。我想我应该再次提到,我的错误处理实际上按照预期工作。我现在看到这个问题的地方是当我用故意错误的数据为我的API运行mocha测试时。错误被捕获并按预期处理,但我仍然看到此消息。我找到了答案。这是因为我的错误处理程序位于与承诺链开始位置不同的模块中。@TomO'Connell nvm我看到你更新了。。。只是2.8.0+和长跟踪应该可以很容易地找到未处理错误的来源
function promise3(value1, value2) {
    return Promise.reject(new Error("the error"))    
}
var promise1 = Promise.resolve();
var promise2 = Promise.resolve();
var promise4 = Promise.join(promise1, promise2, function (value1, value2) {
  // promise 3 needs the values resolved from promise1 and promise2
  return promise3(value1, value2);
});

Promise.all([promise4]).catch(function(error) {
    console.log(error.message === "the error")
});