web-dev-qa-db-fra.com

Comment déterminer si une promesse est prise en charge par le navigateur

Est-ce que quelqu'un sait, en utilisant Modernizr ou autre, s'il existe un moyen de détecter si la fonction Promise est activée dans un navigateur?

J'ai un polyfill pour la fonctionnalité, mais je veux seulement l'appliquer si le navigateur n'a pas d'implémentation native.

29
user2836501

Mise à jour du 11 décembre 2016: Toutes les versions persistantes des navigateurs prennent désormais en charge les promesses. Ils sont sûrs à utiliser.


Mise à jour du 14 novembre 2016: Chrome, Firefox, Safari et IE ont tous maintenant un support expérimental pour les promesses dans leurs canaux de développement. La spécification est réglée. Je ne voudrais toujours pas compter sur l'implémentation pour l'instant et utiliserait une bibliothèque mais cela pourrait changer dans quelques mois.


Aucun navigateur ne prend en charge les promesses de manière native de manière fiable. La spécification pourrait changer - au moins pour quelques mois de plus. Ma suggestion est d'utiliser une bibliothèque de promesses rapides comme Bluebird.

Si vous souhaitez vérifier si les promesses natives sont activées, vous pouvez faire:

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

Comme d'autres l'ont suggéré, vérifier simplement s'il y a un objet Promise peut être fait par if(Promise) mais je le suggère fortement car différentes bibliothèques ont différentes API pour la création de promesses, etc.

36
Benjamin Gruenbaum

Pas si vite.

Ceci lance lorsque "Promise" n'est pas défini:

if (Promise)
  // do code

Cette jamais lance:

if (window.Promise)
  // do code

et oui, l'objet fenêtre peut être utilisé dans un environnement de navigateur.

13
Jason Sebring

Vous pouvez essayer d'en créer un dans un try/catch bloquer:

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

Vérifiez promiseSupport pour voir s'il échoue ou non.

JSFiddle

3
War10ck

Pour créer un indicateur "pris en charge" sans transporter une référence d'objet:

var canPromise = !! window.Promise;
2
Paul Roub

Voici une page répertoriant le navigateur et le support d'exécution pour Promise: https://kangax.github.io/compat-table/es6/

0
Michael Franzl