【问题标题】:Bluebird.resolve(jQuery.ajax) Warning promise rejected with non-error [object Object]Bluebird.resolve(jQuery.ajax) 警告承诺被非错误拒绝 [object Object]
【发布时间】:2016-10-13 07:46:14
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • Bluebird 警告是在最新版本的 Bluebird 中添加的。因此,要么您是两种情况,包括不同版本的 Bluebird,要么其中一种情况正在禁用该警告。
  • Bluebird release notes for 3.0.3 说:“第 3 方库拒绝非错误的承诺不再导致警告”。您是否有足够新的 Bluebird 版本来进行此修复。
  • 它们都是 3.4.6,因为我在开头的 cmets 中看到了。包含的一个来自 /js/browser/bluebird.min.js,当它被捆绑时,它似乎来自 /js/browser/bluebird.js。
  • 已确认:与构建无关。 Bluebird 的缩小版不会发出警告,但普通版会发出警告。不仅是这个警告,还有其他警告,例如“Promise 在处理程序中创建并且未返回”。要进行测试,只需包含一个或另一个。
  • 仅供参考,即使在非缩小版本中,您也可以禁用这些警告。

标签: jquery build promise warnings bluebird


【解决方案1】:

稍微挖了一下,我发现这简直就是一个区别 Bluebird 的两种不同版本。未缩小的构建发出 警告,但缩小版本没有。这是有原因的吗?

这样做是因为未缩小版本被认为是开发人员在编写和进行初始测试时将使用的库的“调试”版本,并且更容易使用调试器进行单步调试。它被设计成带有警告的详细信息,以告知开发人员何时他们可能做错了。

缩小版类似于针对空间进行优化的库的“生产”版本,通常没有必要让您的应用的生产版本向用户控制台发出警告。

在 C/C++ 世界中,这类似于 DLL 的调试版本和 DLL 的优化版本。调试版本将包含 ASSERT() 之类的内容,以通知开发人员如果某些内容不符合预期,则优化版本不会。

【讨论】:

  • 谢谢,很高兴知道这一点。但是现在你如何区分在 Node 中需要它时使用哪一个呢?还是使用 Webpack 构建它? package.json 指向完整的构建。我的意思是,我的代码正在开发中,但是我对 Bluebird 的使用应该始终被视为生产,因为我没有在我的代码中开发它。另外,如果他们删除了第三方库的警告,那不应该也不会在开发版本中引发警告吗?
  • @AndréCoelho - 这些警告不是针对开发 Bluebird 代码的,它们是在您错误地使用 Promise 时向您提供建议。他们可以帮助您正确开发代码。我不知道为什么第三方 jQuery 承诺仍然导致警告。通常使用构建系统,您将有一种生成“调试”构建和“生产”构建的方法,其中一个包含常规版本,另一个包含最小化版本。
  • 再次感谢,这阐明了环境选项。是的,导致警告的第三方库是一个问题,因为我无法在我的代码中对此进行任何处理。我想我会尝试弄清楚如何始终构建它的生产版本。非常感谢。
  • @AndréCoelho - 如果需要,您可以禁用 Bluebird 警告。见这里:bluebirdjs.com/docs/api/promise.config.html
  • 考虑到我们可以相当肯定这是一个错误,因为您指出的发行说明,我认为最好的方法是将其包装在“新承诺”中并手动拒绝,抛出自定义错误。我仍然想要有效案例的警告,我最初的想法是简单地使用缩小版本可能不是一个好主意。但是非常感谢您帮助整理这些内容。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2018-04-14
  • 2018-12-20
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多