【问题标题】:How can code that might run under NodeJS, JXcore, etc detect whether it's running in an environment that supports native ES6 promises?可能在 NodeJS、JXcore 等下运行的代码如何检测它是否在支持原生 ES6 承诺的环境中运行?
【发布时间】:2016-06-10 16:47:42
【问题描述】:

例如,我安装了最新版本的官方 Joyent NodeJS,当然还有 Google V8 JavaScript 引擎,还有 JXcore 和 Mozilla SpiderMonkey JavaScript 引擎。

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

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

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

在这种情况下,如果它检测到适当的 polyfill 为“native”,那就没问题了。但它不应该将像 Q 这样的东西检测为原生承诺。 (或者如果我错了,请告诉我。)

【问题讨论】:

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


    【解决方案1】:

    要直接回答您的问题,请使用它来检测 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]')
    

    【讨论】:

      【解决方案2】:

      好吧,你可以使用package,如果它们可用,则使用原生承诺,如果它们不可用,它会填充它们。

      或者,因为它是服务器,所以在所有环境都支持本机承诺之前,您最好使用compatible userland library

      请注意,jxcore 不支持一些标准的 NodeJS 承诺功能,例如用户态 polyfill 和库支持的 unhandledRejection

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

      【讨论】:

        【解决方案3】:

        这可能会做到:

        Promise.resolve() instanceof Promise
        

        来自comments to this other answer,似乎这只对原生 ES6 承诺返回 true。

        但是,此解决方案可能会拒绝 polyfill。

        【讨论】:

          猜你喜欢
          • 2016-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-05
          • 2018-12-11
          • 2018-12-18
          • 1970-01-01
          • 2020-07-02
          相关资源
          最近更新 更多