在NodeJS,JXcore等下可能运行的代码如何检测它是否在支持本机ES6承诺的环境中运行?

例如,我有当前版本的官方Joyent NodeJS,当然还有Google V8 JavaScript引擎,还有带有Mozilla SpiderMonkey JavaScript引擎的JXcore。

前者似乎来源于原生的诺言支持,后者似乎不是。

(当然,这些并不是nodeJS代码可能运行的唯一两种可能的环境。

我的代码如何testing它的环境以查看它是否可以使用本机Promise?

在这种情况下,如果它检测到一个合适的polyfill是“本地的”就可以了。 但是它不应该检测出像Q这样的本地承诺。 (或者让我知道,如果我错了这个。)

要直接回答您的问题,请使用它来检测ES6承诺的可用性:

typeof global.Promise === 'function' 

或者使用轻量级的ES6 promise polyfill,而不是依赖较大的部分不兼容的库。

使用polyfill,你可以使用正常的Promise API,只require删除require – 不需要重构。


一个更长的,但值得信赖的替代scheme就像这个包使用的东西:

  global.Promise && Object.prototype.toString.call(global.Promise.resolve()) === '[object Promise]') 

那么,你可以使用一个使用本地承诺的软件包 ,如果它们不可用的话,那么它就可以使用。

或者,因为它是服务器,所以使用兼容的userland库可能会更好,直到所有的环境都支持native promise。

请注意,jxcore不支持一些标准的NodeJS承诺function,例如userland polyfill和库支持的unhandledRejection

至于检测本地的承诺 – 在整个环境中可能很难。 从技术上讲,你可以检查程序中是否有全局的Promise对象作为代码的第一行,但与使用兼容的更快的用户空间库相比,这是一团糟。

这可能做到这一点:

 Promise.resolve() instanceof Promise 

从评论到这个其他的答案 ,似乎这只会返回原生的ES6承诺。

但是这个解决scheme可能会拒绝一个polyfill。