Bluebird.resolve(jQuery.ajax) 警告承诺因非错误被拒绝 [object Object]

Bluebird.resolve(jQuery.ajax) Warning promise rejected with non-error [object Object]

问题:在Bluebird.js中将jQuery.ajax传递给Promise.resolve时,请求失败时会抛出警告。

这是正确的行为吗?由于某些我找不到的原因,Bluebird 直接包含在页面中时不会发出此警告。当它与 Webpack 捆绑在一起时,它确实会发出警告。

如果这是正确的行为,那么在 Bluebird 中使用 jQuery.ajax 的正确方法是什么?为什么在页面中直接包含 Bluebird 时不会发生这种情况?

更新:深入挖掘后,我发现这只是 Bluebird 两种不同版本的区别。未缩小的构建会发出警告,但缩小的构建不会。这有什么原因吗?

更新 2:导致警告的原因是 .finally 附加到 promise。像这样:

Promise
  .resolve($.getJSON('/notfound'))
  .finally(() => {})
  .catch(() => {});

这会导致警告: https://jsfiddle.net/gf0jk80s/1/

这不会引起警告: https://jsfiddle.net/gf0jk80s/2/

如您所见,唯一的区别是使用的构建版本。如果有人能指出我的代码有什么问题,我将不胜感激。理想情况下,我希望它不会对 Bluebird 的两个构建版本发出警告。在示例中,函数是空的,但在实际代码中,我实际上在这两个处理程序中做了一些事情。

After digging a little bit, I find that it is simply a difference of the two different builds of Bluebird. The unminified build emits warnings, but the minified build does not. Is there a reason for this?

这样做是因为未缩小版本被认为是开发人员在编写和进行初始测试时将使用的库的 "debug" 版本,并且更容易通过调试器逐步完成。它被设计成冗长的警告,告诉开发人员他们可能做错了什么。

缩减版本类似于针对 space 优化的库的 "production" 版本,通常没有必要让您的应用程序的生产版本向用户的控制台发出警告。

在C/C++ 世界中,这类似于 DLL 的调试版本和 DLL 的优化版本。调试版本将包含 ASSERT() 之类的内容以通知开发人员是否出现问题,优化版本则不会。