【问题标题】:How to determine if a Promise is supported by the browser如何确定浏览器是否支持 Promise
【发布时间】:2014-04-26 08:28:19
【问题描述】:

有没有人知道,使用 Modernizr 或其他方式,是否有办法检测浏览器中是否启用了 Promise 功能?

我有一个用于该功能的 polyfill,但只想在浏览器没有本机实现的情况下应用它。

【问题讨论】:

标签: javascript promise browser-detection es6-promise


【解决方案1】:

2016 年 12 月 11 日更新:所有常青版本的浏览器现在都支持 Promise。它们可以安全使用。


2016 年 11 月 14 日更新:Chrome、Firefox、Safari 和 IE 现在都在其开发通道中提供了对 Promise 的实验性支持。规范已经确定。我仍然不会依赖实现,而是会使用一个库,但这可能会在几个月内改变。


没有浏览器以可靠的方式原生支持 Promise。规范可能会改变——至少再过几个月。我的建议是使用像 Bluebird 这样的快速承诺库。

如果您想检查是否启用了原生承诺 - 您可以这样做:

if(typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1){
    //here
}

正如其他人所建议的,if(Promise) 可以仅检查是否存在 Promise 对象,但我强烈建议不要这样做,因为不同的库有不同的 API 用于创建 Promise 等。

【讨论】:

  • 不应该是typeof Promise !== "undefined",因为typeof返回一个字符串?
  • @PaulRoub 是的,它以Promise !== undefined 开头,但我意识到可能没有声明标识符。
  • 如果您想知道您正在使用的 Promise 是本机还是 polyfill,这将特别有用。不幸的是,许多 polyfill(包括 Traceur 使用的)没有设置标志来表明它们不是原生的。
  • @PhpMyCoder 你为什么要关心?
  • Native Promises(以及原生 Promise.all())+ Traceur 生成器目前已损坏:github.com/google/traceur-compiler/issues/1955
【解决方案2】:

没那么快。

当“Promise”未定义时抛出

if (Promise)
  // do code

从不抛出:

if (window.Promise)
  // do code

if (typeof Promise !== 'undefined')
  // do code

是的,可以在浏览器环境中依赖 window 对象。

【讨论】:

  • Object.defineProperty(window, 'Promise', { get() { throw Error(); }});
【解决方案3】:

在不携带对象引用的情况下创建“支持”标志:

var canPromise = !! window.Promise;

【讨论】:

  • 我喜欢这张支票,有人反对这张支票吗?我特意指的是 window.Promise 不是 undefined。
【解决方案4】:

您可以尝试在try/catch 块中创建一个:

var promiseSupport = false;
try {
    var promise = new Promise(function (x, y) {});
    promiseSupport = true;
} catch (e) {}

检查promiseSupport 看它是否失败。

JSFiddle

【讨论】:

    【解决方案5】:

    这是一个列出 Promise 的浏览器和运行时支持的页面:https://kangax.github.io/compat-table/es6/

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2020-01-04
      相关资源
      最近更新 更多