Javascript ES6承诺错误处理
我目前正在阅读Kyle Simpson的“YKDJS-异步与性能”,特别是第3章-承诺 作者表示,未注册拒绝处理程序的任何承诺都会收到默认承诺:Javascript ES6承诺错误处理,javascript,ecmascript-6,Javascript,Ecmascript 6,我目前正在阅读Kyle Simpson的“YKDJS-异步与性能”,特别是第3章-承诺 作者表示,未注册拒绝处理程序的任何承诺都会收到默认承诺: let p = new Promise(function(resolve, reject) { resolve("Yay!"); }); p.then( function(val) { /* Do whatever */ } /* Default rejection handler , function(e) { throw e; } *
let p = new Promise(function(resolve, reject) { resolve("Yay!"); });
p.then(
function(val) { /* Do whatever */ }
/* Default rejection handler
, function(e) { throw e; } */
);
在本章后面部分,他声称Promise
s的设计方式存在以下问题:
在任何Promise
链中,链中最后一个Promise
的一个处理程序函数中发生的任何错误都只是“吞没”而不是报告。
他建议更改Promise
s的工作方式,以便任何没有拒绝处理程序的Promise
都可以通过抛出全局错误来报告错误。然后,他提出了一个理论上的Promise#defer()
函数,可以用于Promise
来防止这种报告行为
现在我的问题是:这两者如何结合?确实,任何没有拒绝处理程序的Promise
都会收到一个默认值,它只是将拒绝值作为全局错误抛出:
Promise.reject("Oops");
/* VM668:1 Uncaught (in promise) Oops */
因此,Promise
s似乎已经按照他提议的方式工作了。
我是不是误解了什么?谢谢您的帮助。中的
一些Promise库添加了注册某些内容的方法
类似于“全局未处理拒绝”处理程序,将调用
而不是全局抛出的错误。但他们的解决方案是如何
将错误标识为“未捕获”是指具有任意长度的计时器,
比如说3秒钟,从被拒绝的时间算起。如果承诺是
已拒绝,但在计时器触发之前未注册错误处理程序,
然后假设您永远不会注册处理程序,所以
这是“未破坏的”
在实践中,这对许多库都很有效,因为大多数使用
模式通常不要求承诺之间有明显的延迟
拒绝和对拒绝的观察
已标准化为(不使用任意计时器,但立即开火)。它确实非常有效
他还说
[当]我们没有听到这种拒绝,[…]它将是
默默地抓住它,等待将来的观察。如果你从来没有观察过它
调用然后(…)
或捕获(…)
,则它将不被处理。一些
浏览器开发人员控制台可能会检测到这些未经处理的拒绝和
报告,但这不是可靠的保证;你应该永远
遵守拒绝承诺
在
一些Promise库添加了注册某些内容的方法
类似于“全局未处理拒绝”处理程序,将调用
而不是全局抛出的错误。但他们的解决方案是如何
将错误标识为“未捕获”是指具有任意长度的计时器,
比如说3秒钟,从被拒绝的时间算起。如果承诺是
已拒绝,但在计时器触发之前未注册错误处理程序,
然后假设您永远不会注册处理程序,所以
这是“未破坏的”
在实践中,这对许多库都很有效,因为大多数使用
模式通常不要求承诺之间有明显的延迟
拒绝和对拒绝的观察
已标准化为(不使用任意计时器,但立即开火)。它确实非常有效
他还说
[当]我们没有听到这种拒绝,[…]它将是
默默地抓住它,等待将来的观察。如果你从来没有观察过它
调用然后(…)
或捕获(…)
,则它将不被处理。一些
浏览器开发人员控制台可能会检测到这些未经处理的拒绝和
报告,但这不是可靠的保证;你应该永远
遵守拒绝承诺
好文章。有助于理解承诺@VasylGutnyk这是如何回答这个问题的?@Bergi u可以找到关于错误处理的信息示例。@Bergi Vasyl将其作为评论而不是答案发布。他们链接到的信息可能有助于OP更好地理解承诺。好文章。有助于理解承诺@VasylGutnyk这是如何回答这个问题的?@Bergi u可以找到关于错误处理的信息示例。@Bergi Vasyl将其作为评论而不是答案发布。他们链接的信息可能有助于OP更好地理解承诺。感谢您的澄清!谢谢你的澄清!