Как определить, поддерживается ли Promise браузером

Кто-нибудь знает, используя Modernizr или иначе, если есть способ определить, включена ли функция Promise в браузере?

Я имею полиполк для функциональности, но хочу только применить его, если браузер не имеет собственной реализации.

Ответ 1

Обновление от 11 ноября 2016 года: все вечнозеленые версии браузеров теперь поддерживают обещания. Они безопасны в использовании.


Обновление 14 ноября 2016 года: теперь Chrome, Firefox, Safari и IE имеют экспериментальную поддержку обещаний в своих dev-каналах. Спецификация оговорена. Я все еще не буду полагаться на реализацию еще и использовать библиотеку, но это может измениться через несколько месяцев.


Никакие браузеры не поддерживают обещания изначально надежным способом. Спецификация может измениться - по крайней мере, еще несколько месяцев. Мое предложение - использовать библиотеку с быстрыми обещаниями, такую как Bluebird.

Если вы хотите проверить, включены ли нативные обещания, вы можете:

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

Как и другие, просто проверить, есть ли объект Promise можно сделать, if(Promise) но я настоятельно рекомендую против него, поскольку разные библиотеки имеют разные API для создания обещаний и т.д.

Ответ 2

Не так быстро.

Это срабатывает, когда "Promise" не определено:

if (Promise)
  // do code

Это никогда не бросает:

if (window.Promise)
  // do code

и да, на объект окна можно опираться в среде браузера.

Ответ 3

Вы можете попытаться создать его в блоке try/catch:

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

Проверьте, promiseSupport ли promiseSupport.

JSFiddle

Ответ 4

Чтобы создать флаг "поддерживается" без переноса ссылки на объект:

var canPromise = !! window.Promise;

Ответ 6

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