37

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

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

4

4 回答 4

44

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
}

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

于 2014-03-19T20:16:21.960 回答
16

没那么快。

当“Promise”未定义时抛出:

if (Promise)
  // do code

永远不会抛出:

if (window.Promise)
  // do code

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

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

于 2016-03-26T04:07:44.750 回答
6

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

var canPromise = !! window.Promise;
于 2014-03-19T20:14:23.397 回答
3

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

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

检查promiseSupport它是否失败。

JSFiddle

于 2014-03-19T20:20:28.977 回答