Как определить, поддерживается ли 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;
Ответ 5
Вот браузер страниц и поддержка времени выполнения для Promise: https://kangax.github.io/compat-table/es6/
Ответ 6
if (Promise) {
alert("Promise is supported!");
} else {
alert("Promise is not supported!");
}