如何确定浏览器是否支持Promise

时间:2014-03-19 20:07:27

标签: javascript promise browser-detection es6-promise

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

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

6 个答案:

答案 0 :(得分:35)

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


更新2016年11月14日: Chrome,Firefox,Safari和IE现在都在其开发频道中实现了承诺的实验性支持。规范已经解决。我现在仍然不会依赖于实现并使用库,但这可能会在几个月后发生变化。


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

如果要检查是否启用了本机承诺 - 您可以执行以下操作:

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

正如其他人所建议的,只是检查是否有Promise对象可以由if(Promise)完成,但我强烈反对它,因为不同的库有不同的API来创建承诺等。

答案 1 :(得分:13)

没那么快。

抛出当"承诺"未定义:

if (Promise)
  // do code

从不抛出:

if (window.Promise)
  // do code

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

答案 2 :(得分:3)

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

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

检查promiseSupport以查看它是否失败。

<强> JSFiddle

答案 3 :(得分:2)

创建“支持”标志而不携带对象引用:

var canPromise = !! window.Promise;

答案 4 :(得分:0)

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

答案 5 :(得分:-3)

if (Promise) {
   alert("Promise is supported!");
} else {
   alert("Promise is not supported!");
}