Javascript 如何使用Bluebird错误处理程序? 介绍
这个问题的目的是,最终解决我在蓝鸟开发中遇到的一个问题。不过,我也在利用这个机会澄清一些事情,所以会有一些附带问题。对于您在阅读即将到来的故事时可能遇到的任何困惑或厌倦,我也提前表示歉意Javascript 如何使用Bluebird错误处理程序? 介绍,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,这个问题的目的是,最终解决我在蓝鸟开发中遇到的一个问题。不过,我也在利用这个机会澄清一些事情,所以会有一些附带问题。对于您在阅读即将到来的故事时可能遇到的任何困惑或厌倦,我也提前表示歉意 问题 据我所知,蓝鸟试图根据以下策略,智能地捕捉被忽视的拒绝: 第二种方法是bluebird默认采用的方法,如果拒绝在第二轮开始时未得到处理,则调用已注册的处理程序。 -- 现在这里有了第一个次要问题:第二轮的开始是什么意思? 在同一章节的后面部分,将记录以下内容: 当然,这并不完美,如果您的代码出于某种原因
问题 据我所知,蓝鸟试图根据以下策略,智能地捕捉被忽视的拒绝: 第二种方法是bluebird默认采用的方法,如果拒绝在第二轮开始时未得到处理,则调用已注册的处理程序。 -- 现在这里有了第一个次要问题:第二轮的开始是什么意思? 在同一章节的后面部分,将记录以下内容: 当然,这并不完美,如果您的代码出于某种原因需要在某个承诺挂起一段时间后突然插入并将错误处理程序附加到某个承诺上,那么您将看到恼人的消息。在这种情况下,您可以使用.done()方法发出信号,表示应该抛出任何挂起异常。 -- 现在,我相信我遇到了上述情况,我的用例如下:
lib.loadUrls().finally(function () {
// cleanup
}).done();
- 我调用一个函数,该函数将为我提供承诺,并附加一个
:.catch()
- 在内部,该函数从URL1加载内容,并基于内容,按顺序从URL2加载内容:
lib.loadUrls = return this.loadUrl1() .then(this.loadUrl2.bind(this))
- 如果此链中的第二个承诺被拒绝,则首先由catch处理错误,然后由bluebird
处理程序处理可能未处理的错误
.catch()
时,承诺“已经存在了一段时间”。在这种情况下,我应该通过“使用.done()
”来解决它(根据引用的文档)
现在,我尝试了几种方法,但我不太明白如何在这个场景中“使用.done”。(如果.done()
返回undefined,则阻止我.finally
-ing,这对我没有帮助。)
因此,这里介绍了我的第三个和第四个问题:在这个场景中,我如何使用.done()
,和我如何明确地结束承诺链,但仍然附加。finally()
编辑1:我已经创建了一些JSFIDLE来重现错误:
- 复制错误
- 复制错误(此时)
- 不会重现该错误
编辑2:开发人员发现了这个bug。这很可能是蓝鸟bug,因为已处理的错误不应报告(假设您正确处理了
loadURL
正文中的承诺)。所以也许你应该向蓝鸟问题追踪者报告
关于done
,最好使用纯访问功能,而不是在处理解析值时使用then
或catch
最好将done
视为首选函数,仅当您确实需要转换为其他承诺时才使用然后使用和catch
,使用这种方法,您也不需要依赖bug错误监视(最好完全关闭它)
在您的情况下,done
应用作:
lib.loadUrls().done(); // eventual error will be thrown
如果出于某种原因,您希望专门处理错误(例如,在运行服务器时,您不希望抛出错误),请执行以下操作:
编辑:
刚才注意到,您仍然希望使用finally
处理lib.loadUrls().catch(…)
返回的承诺。在这种情况下,done
不是解决方案done
应仅用作最终调用,但您可以将其与finally
组合,如下所示:
lib.loadUrls().finally(function () {
// cleanup
}).done();
这实际上只是蓝鸟的一个回归错误,现在已经修复了
关于需要使用.done()
的部分基本上是理论性的,在实际运行中,您不会遇到需要附加错误处理程序以导致报告误报的情况。请显示完整的被调用者和调用者函数体。我已经创建了一个复制错误的函数体。打开页面时,您将看到错误由错误处理程序处理,然后由未处理的错误处理程序处理。谢谢<代码>完成
和最后
现在对我来说都清楚了。您可能认为它是一个bug,这是对的,就像我所说的:lib.loadUrls().catch(handleError.done()
<代码>句柄错误
被调用。done
不会引发异常,之后蓝鸟仍会将其处理为“可能未处理”。你能为我澄清最后一件事吗。什么时候开始“第二回合”?也许随着对实际发生情况的进一步了解,我可以制作一份更好的bug报告。请看一下我在问题中编辑的JSFiddles。
lib.loadUrls().finally(function () {
// cleanup
}).done();