JavaScript promet vs Async attendent. La différence?

J'utilise déjà les fonctionnalités ES6 et ES7 (grâce à Babel) dans Mes applications-mobiles et web.

La première étape était évidemment aux niveaux ES6. J'ai appris beaucoup de modèles asynchrones, les promesses (qui sont vraiment prometteuses), les générateurs (Je ne sais pas pourquoi le symbole*) etc., Parmi ceux-ci, les promesses convenaient assez bien à mon but. Et je les ai beaucoup utilisés dans Mes applications.

Voici un exemple / pseudocode de la façon dont j'ai implémenté un basic promesse-

var myPromise = new Promise(
    function (resolve,reject) {
      var x = MyDataStore(myObj);
      resolve(x);
    });

myPromise.then(
  function (x) {
    init(x);
});

Au fil du temps, je suis tombé sur des fonctionnalités ES7, et l'une d'entre elles étant ASYNC et AWAIT mots-clés/fonctions. Ceux-ci en conjonction font de grandes merveilles. J'ai commencé à remplacer certaines de mes promesses par async & await. Ils semblent ajouter une grande valeur au style de programmation.

Encore une fois, voici un pseudocode de la façon dont ma fonction async, await ressemble à -

async function myAsyncFunction (myObj) {
    var x = new MyDataStore(myObj);
    return await x.init();
}
var returnVal = await myAsyncFunction(obj);

Garder les erreurs de syntaxe(le cas échéant) de côté, les deux font exactement la même chose est ce que je ressens. J'ai presque été en mesure de remplacer la plupart de mes promesses avec async, attend.

Ma question ici est, pourquoi async, attend nécessaire quand Promises fait un travail similaire? Est-ce que async, attend résoudre un plus gros problème? ou était-ce juste une solution différente pour rappeler l'enfer? Comme je l'ai dit plus tôt, je suis capable d'utiliser Promises et Async,Await pour résoudre le même problème. Y a-t-il quelque chose de spécifique que Async attend résolu?

Remarques Supplémentaires: J'ai utilisé Async, Awaits & Promises dans mes projets ReactJS & node modules largement. ReactJS en particulier ont été un lève-tôt et a adopté beaucoup de fonctionnalités ES6 et ES7.

45
demandé sur SystematicFrank 2015-12-21 20:37:54

6 réponses

Pourquoi async, attend nécessaire quand Promises fait un travail similaire? Est-ce que async, attend résoudre un plus gros problème?

async/await Vous donne simplement une sensation synchrone au code asynchrone. C'est une forme très élégante de sucre syntaxique.

Pour les requêtes simples et la manipulation de données, les promesses peuvent être simples, mais si vous rencontrez des scénarios où il y a une manipulation de données complexe et autres, il est plus facile de comprendre ce qui se passe si le code semble simplement comme bien qu'il soit synchrone (pour le dire autrement, la syntaxe en soi est une forme de "complexité incidente" que async/await peut contourner).

Si vous êtes intéressé à savoir, vous pouvez utiliser une bibliothèque comme co (aux côtés de générateurs) pour donner le même genre de sensation. Des choses comme celle - ci ont été développées pour résoudre le problème que async/await résout finalement (nativement).

38
répondu Josh Beam 2015-12-21 17:56:12

Async / Await fournit une syntaxe beaucoup plus agréable dans des scénarios plus complexes. En particulier, tout ce qui concerne les boucles ou certaines autres constructions comme try/catch.

Par exemple:

while (!value) {
  const intermediate = await operation1();
  value = await operation2(intermediate);
}

Cet exemple serait beaucoup plus alambiqué simplement en utilisant des promesses.

22
répondu Stephen Cleary 2015-12-21 17:56:02

Comparaison complète avec les avantages et les inconvénients.

Vous Avez Besoin D'Aide?]}

  • Avantages
  • ne nécessite aucune bibliothèque ou technologie supplémentaire
  • offre les meilleures performances
  • fournit le meilleur niveau de compatibilité avec les bibliothèques tierces
  • permet la création d'algorithmes ad hoc et plus avancés
  • inconvénients
  • peut nécessiter un supplément code et algorithmes relativement complexes

Async (bibliothèque)

  • Avantages
  • simplifie les schémas de flux de contrôle les plus courants
  • est toujours une solution basée sur le rappel
  • Bonne performance
  • inconvénients
  • Introduit une dépendance externe
  • pourrait encore ne pas être suffisant pour les flux avancés

Promesses

  • Avantages
  • simplifie grandement les modèles de flux de contrôle les plus courants
  • gestion robuste des erreurs
  • Partie de la spécification ES2015
  • garantit l'invocation différée de onFulfilled et onRejected
  • inconvénients
  • nécessite des API de rappel promisify
  • introduit un petit hit de performance

Groupes électrogènes

  • Avantages
  • fait ressembler L'API non bloquante à une API bloquante
  • simplifie la gestion des erreurs
  • Partie de ES2015 Spécification
  • inconvénients
  • nécessite une bibliothèque de flux de contrôle complémentaire
  • nécessite toujours des rappels ou des promesses pour implémenter des flux non séquentiels
  • nécessite thunkify ou promisify nongenerator Api en fonction de

Asynchrone attendre

  • Avantages
  • fait ressembler L'API non bloquante au blocage
  • syntaxe propre et intuitive
  • inconvénients
  • nécessite Babel ou d'autres transpilers et une certaine configuration à utiliser aujourd'hui

6
répondu Bozhinovski Vladimir 2017-11-20 15:27:44

Async / await peut aider à rendre votre code plus propre et plus lisible dans les cas où vous avez besoin d'un flux de contrôle compliqué. Il produit également un code plus convivial pour le débogage. Et permet de gérer les erreurs synchrones et asynchrones avec juste try/catch.

J'ai récemment écrit ce post montrant les avantages de async / await sur les promesses dans certains cas d'utilisation courants avec des exemples de code https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9

5
répondu Gaafar 2017-03-29 10:50:06

Les deux sont les moyens de gérer le code asynchrone. Mais il y a une différence avec l'exécution de chacun. Voici l'exécution de travail -

Promesse

L'objet Promise représente l'achèvement (ou l'échec) possible d'une opération asynchrone et sa valeur résultante. C'est un proxy pour une valeur pas nécessairement connue à son moment de création, et il représente le résultat futur d'une opération asynchrone.

Le code appelant peut attendre que cette promesse soit remplie avant l'exécution de l'étape suivante. Pour ce faire, la promesse a une méthode nommée then, qui accepte une fonction qui sera appelée lorsque la promesse a été accomplie.

Async/await

Lorsqu'une fonction async est appelée, elle renvoie un Promise. Lorsque la fonction async renvoie une valeur, la Promise sera résolue avec la valeur renvoyée. Lorsque la fonction async lève une exception ou une valeur, la promesse sera rejetée avec la valeur levée.

Une fonction asynchrone peut contient une expression await, qui interrompt l'exécution de la fonction asynchrone et attend la résolution de la promesse passée, puis reprend l'exécution de la fonction asynchrone et renvoie la valeur résolue

Avantages de async / await over promise

  • async / await est construit afin de donner une syntaxe propre au continuation sémantique des opérations asynchrones.
  • cela évite l'enfer de callback / promise.
0
répondu Samiksha Jagtap 2018-08-22 07:56:40

Ma question ici est, pourquoi async, attend nécessaire quand Promises fait emploi similaire? Est-ce que async, attend résoudre un plus gros problème? ou était-ce juste un solution différente pour rappeler l'enfer? Comme je l'ai dit plus tôt, je suis capable de utilisez Promises et Async, Await pour résoudre le même problème. Est-il quelque chose de spécifique que Async attend résolu?

Les premières choses que vous devez comprendre que async/await la syntaxe est juste du sucre syntaxique qui est destiné à augmenter les promesses. En fait, le la valeur de retour d'une fonction async est une promesse. async/await la syntaxe nous donne la possibilité d'écrire asynchrone de manière synchrone. Voici un exemple:

Promesse chaîne:

function logFetch(url) {
  return fetch(url)
    .then(response => response.text())
    .then(text => {
      console.log(text);
    }).catch(err => {
      console.error('fetch failed', err);
    });
}

Async fonction:

async function logFetch(url) {
  try {
    const response = await fetch(url);
    console.log(await response.text());
  }
  catch (err) {
    console.log('fetch failed', err);
  }
}

Dans l'exemple ci-dessus le await attend la promesse (fetch(url)) soit être résolu ou rejeté. Si la promesse est résolue, la valeur est stockée dans la variable response, si la promesse est rejetée, elle génère une erreur et donc entrez le bloc catch.

Nous pouvons déjà voir cela en utilisant async/await peut - être plus lisible que le chaînage de promesses. Cela est particulièrement vrai lorsque le montant des promesses que nous utilisons augmente. Les deux promettent le chaînage et async/await résoudre le problème de l'enfer de rappel et quelle méthode vous choisissez est une question de préférence personnelle.

0
répondu Willem van der Veen 2018-09-14 08:46:04