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

时间:2016-02-27 11:33:26

标签: node.js promise feature-detection es6-promise jxcore

例如,我安装了当前最新版本的官方Joyent NodeJS,其中包括Google V8 JavaScript引擎以及带有Mozilla SpiderMonkey JavaScript引擎的JXcore。

前者似乎带有原生的Promises支持,后者似乎没有。

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

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

如果检测到正确的polyfill为" native"在这种情况下。但它不应该像Q一样检测本地承诺。 (或者,如果我对此错了,请告诉我。)

3 个答案:

答案 0 :(得分:2)

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

typeof global.Promise === 'function'

或者使用lightweight ES6 promise polyfill而不是依赖更大的部分不兼容的库。

使用polyfill,您可以使用普通的Promise API,只需在不再需要时删除require - 无需重构。

更长但更值得信赖的替代方案就像这个package uses

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

答案 1 :(得分:1)

好吧,你可以使用package使用原生承诺,如果他们可以获得,如果他们不是,那么就会使用本地承诺。

或者,由于它是服务器,因此您可能最好使用compatible userland library,直到所有环境都支持本机承诺。

请注意,jxcore不支持某些标准的NodeJS承诺功能,例如userland polyfills和library支持的unhandledRejection

至于检测原生承诺 - 跨环境可能很难。从技术上讲,您可以检查是否有一个全局Promise对象作为程序中的第一行代码,但与使用兼容的更快的用户态库的替代方案相比,它更加混乱。

答案 2 :(得分:1)

这可能会这样做:

Promise.resolve() instanceof Promise

comments to this other answer开始,对于本机ES6承诺,它似乎只会返回true。

然而,这种解决方案可能会拒绝填充。