例如,我安装了当前最新版本的官方Joyent NodeJS,其中包括Google V8 JavaScript引擎以及带有Mozilla SpiderMonkey JavaScript引擎的JXcore。
前者似乎带有原生的Promises支持,后者似乎没有。
(当然,这些并不是nodeJS代码可能运行的唯一两种可能的环境。
我的代码如何测试其环境以查看它是否可以使用本机Promise?
如果检测到正确的polyfill为" native"在这种情况下。但它不应该像Q一样检测本地承诺。 (或者,如果我对此错了,请告诉我。)
答案 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。
然而,这种解决方案可能会拒绝填充。