【问题标题】:bluebird.js P and Promise globals not availablebluebird.js P 和 Promise 全局变量不可用
【发布时间】:2014-11-05 01:40:49
【问题描述】:

我已经包含了 bluebird.js 脚本,如下所示: https://github.com/petkaantonov/bluebird#quick-start

所以现在我期待这个:

全局变量 Promise 和 P(Promise 的别名)变为 在上述脚本标记之后可用。

但是,检查全局 Promise 变量,我发现这是原生 Chrome 实现,而不是 bluebird 承诺。好吧,不覆盖本机实现似乎是合乎逻辑的。但是,仍然没有来自 bluebird 的全局 P 变量。这是为什么?

我尝试的另一个选项是使用:

var prom = require("bluebird");

但是当我尝试要求时,它显示“错误:undefinedModule”。一个可能的原因是我正在使用 dojo,它有自己的模块加载器和定义/要求功能。所以这可能是某种名称冲突。

毕竟,主要问题仍然存在 - 当全局变量(Promise 和 P)不存在且 require 不起作用时,我该如何使用 bluebird promise?

【问题讨论】:

  • 您是否将 bluebird.js 文件放在您自己的服务器上?您是否 100% 确定您的 <script> 标签 URL 正确指向您的 bluebird.js 副本?听起来您的脚本标签没有正确加载库。
  • 是的,我从本地文件夹加载它。在开发工具中,我可以看到脚本已正确加载。

标签: javascript dojo promise bluebird


【解决方案1】:

Bluebird 假设您的模块类似于节点,因此使用模块加载器。您可以欺骗它认为没有涉及任何模块。

以下是针对此限制的破解:

首先 - 备份 require 函数并将其删除:

var oldRequire = require;
require = null

然后,包括蓝鸟。

最后,恢复它。

var require = oldRequire

所以整个行动过程如下:

 <script>
     var oldReq = require;
     require = undefined;
 </script>
 <script src="bluebird.js"> </script>
 <script>
      require = oldReq;
      oldReq = undefined;
 </script>

【讨论】:

  • 一个小(但很重要)的补充——我需要对'define'函数做同样的事情,否则它不起作用。完成之后,这个解决方案似乎奏效了。我是否理解正确,蓝鸟向本机 Promise 对象添加了方法?这不会在以后引入一些兼容性问题吗?
  • @andree 不,它不会向本地 Promise 对象添加属性,而是创建自己的 Promise 对象 - 不存在兼容性问题 :)
  • 可怕而天才
【解决方案2】:

Bluebird 确​​实注意到您正在使用 AMD 模块加载器(在您的情况下来自 Dojo),并且确实将自己注册为模块而不定义任何全局变量。

出于某种奇怪的原因,它确实声明了 "Promise" 模块而不是 "Bluebird" 模块。使用require("Promise") 应该可以。

【讨论】:

  • 它抛出“错误:undefinedModule”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2023-03-14
  • 1970-01-01
  • 2022-01-28
相关资源
最近更新 更多