2015-02-10 140 views
2

我写了很多代码使用此模式,并onPossiblyUnhandledRejection处理类似的例子可以在蓝鸟的documentation发现:返回的拒绝承诺和蓝鸟

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 (err) { 
    // handle error 
}); 

问题是,如果promise3被拒绝,它会触发蓝鸟的onPossiblyUnhandledRejection处理程序,因为它在连接到任何承诺链(具有错误处理)之前被拒绝。当没有任何事情发生错误时,这会导致大的错误信息不断被打印出来。

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

bluebird's documentation样的地址的这个问题,在一定程度上使得它听起来好像上面的图案是一个奇怪的一个:

“如果你因为某些原因代码需要趁虚而入并附加错误处理的一些承诺在承诺挂了一段时间后,你会看到恼人的消息“

我的”某些原因“是我需要构建高度并发的软件。这是我接近这种问题的根本缺陷吗?如果不是,我应该如何解决这个问题而不完全删除这些警告?

+0

请在代码中显示您实际将错误处理程序附加到链中的位置(以及何时)。 – Bergi 2015-02-10 19:13:09

+0

所以你的错误处理程序被称为*和*你几乎在同一时间得到未处理拒绝事件?这听起来像一个错误。 – Bergi 2015-02-10 19:48:05

+0

是的,这发生在我的应用程序的许多地方,但错误总是被成功捕获。如果它改变任何promise3可能是立即被拒绝的东西,例如具有同步逻辑的Promise.try。 – 2015-02-10 19:50:22

回答

1

正如我评论了你的代码只是正常工作而不报告未处理的拒绝:

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") 
}); 

http://jsfiddle.net/6hx0zdd2/

更重要的可能是,你已经忘记了return声明某处这是需要线失信在一起,使链接(和错误传播)的工作。

+0

我倾向于同意你的看法,因为我构建了自己的孤立示例,但没有看到问题。尽管如此,我还没有发现我的实际代码有什么问题。 – 2015-02-10 21:06:57

+0

@ TomO'Connell您可以尝试启用长堆栈跟踪并跟踪跟踪。例如,在这个jsfiddle我忘了返回,但你可以按照记录的踪迹,看看它发生了什么http://jsfiddle.net/6hx0zdd2/1/ – Esailija 2015-02-10 21:07:52

+0

刚试过这个。被拒绝的承诺肯定会在所有情况下被退回。仍然在寻找原因。我想我应该再次提到我的错误处理实际上按预期工作。我现在看到这个问题的地方是当我用故意错误的数据为我的API运行我的摩卡测试时。错误被捕获并按预期处理,但我仍然看到此消息。 – 2015-02-10 21:28:02