这是一个值得讨论的好话题,可悲的消息是,使用本地承诺实际上很难。
在Chrome中调试原始ES6承诺太可怕了。这是因为它们将默默地抑制错误,并且每当您忽略捕获时,都不会给您任何表示诺言失败的迹象。更新:Chrome现在记录未处理的拒绝(有关方法,请参见此链接)
Promise.resolve("foo").then(function(){
throw new Error("You will never see this");
});
在Firefox中,由于它们执行未处理的拒绝检测,因此效果会更好一些-但是,它仍然是易碎品,如果您将诺言分配到任何地方都将无法使用。
那么,该怎么办呢?
包括Bluebird-它是ES6 Promise的超集,您可以在内部互换它,它具有更丰富的API,它更快,并且具有令人惊叹的堆栈跟踪。它的构建考虑了调试,并包括出色的错误处理功能。
包含Bluebird之后,请致电:
Promise.longStackTraces();
这会使它变慢一点(它仍然会非常快),并且会给您惊人的错误消息。例如:
Promise.resolve().then(function outer() {
return Promise.resolve().then(function inner() {
return Promise.resolve().then(function evenMoreInner() {
a.b.c.d()
});
});
});
在本机承诺中-这将是一个无提示的失败,并且将很难调试-在Bluebird承诺中,默认情况下,它将在控制台中显示一个大的红色错误,从而为您提供:
ReferenceError: a is not defined
at evenMoreInner (<anonymous>:6:13)
From previous event:
at inner (<anonymous>:5:24)
From previous event:
at outer (<anonymous>:4:20)
From previous event:
at <anonymous>:3:9
at Object.InjectedScript._evaluateOn (<anonymous>:581:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52)
at Object.InjectedScript.evaluate (<anonymous>:459:21)
完成调试后,您可以将其换出并返回本机Promise。就我个人而言,我很高兴知道自己在生产中存在错误,因此不建议这样做,但肯定是可行的。
reject('Error')
但是您可以发布jsfiddle,以便我们可以进行一些具体工作吗?