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.
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).
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.
Comparaison complète avec les avantages et les inconvénients.
Vous Avez Besoin D'Aide?]}
Async (bibliothèque) Promesses Groupes électrogènes Asynchrone attendre
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
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.
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.