Comment exécuter async / await en parallèle en Javascript
Enfin async
/await
sera pris en charge dans tous les principaux navigateurs bientôt sauf IE.
Ainsi, nous pouvons maintenant commencer à écrire un code plus lisible avec async
/await
mais il ya un hic. Beaucoup de gens utilisent async attendent comme ceci:
const userResponse = await fetchUserAsync();
const postsResponse = await fetchPostsAsync();
Bien que ce code soit lisible, il a un problème, il exécute les fonctions de la série, de ne pas démarrer l'extraction de messages jusqu'à ce que l'extraction de l'utilisateur est terminé. La solutions est simple, nous avons besoin de récupérer les ressources en parallèle.
Donc ce que je veux faire, c'est (en pseudo-langage):
fn task() {
result-1 = doAsync();
result-2 = doAsync();
result-n = doLongAsync();
//handle results together
combinedResult = handleResults(result-1, result-2);
lastResult = handleLastResult(result-n);
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire quelque chose comme ceci:
C'est facile à droite? Mais il y a un hic.
Promise.all
a fail-fast comportement qui signifie, qu'elle rejette dès que l'une des promesses rejeté. Probablement vous voulez une solution plus robuste où nous sommes en charge de la gestion des rejets tout de l'extrait. Heureusement il existe une solution, il peut être réalisé simplement avecasync
/await
sans avoir besoin de l'aide dePromise.all
. Un exemple de travail:JS:
Remarque: Vous aurez besoin d'un navigateur qui a
async
/await
activé pour exécuter cet extrait de code (ou nodejs v7 et ci-dessus)De cette façon, vous pouvez utiliser simplement
try
/catch
pour gérer vos erreurs, et de renvoyer des résultats partiels à l'intérieur de laparallel
fonction.for (let i = 0; i < serviceList.length; i++) { let result = await this.doSomething(stackServicesList[i].id); };
J'ai essayé de créer unlet result = []
puis pousser certains attendent à l'intérieur d'elle, sans succès.const { performance } = require('perf_hooks');
series
etparallel
ont un "fail fast" comportement trop. le texte de réponse est trompeuse.try { let [val1, val2] = await Promise.all([ task1().catch(e => ...), task2().catch(e => ...) ]); } catch(e) { }
Si vous êtes ok avec le fail-fast comportement de la Promesse.tous les et la déstructuration syntaxe:
?page=home:36 Uncaught SyntaxError: await is only valid in async function
lorsque vous essayez cette méthode.. Mais peut-être tort de cas d'utilisationPour ceux qui demandent comment vous l'étendre à un nombre déterminé d'appels, vous pouvez utiliser les 2 boucles. Les premiers départs de toutes les tâches, le second attend tout pour finir
JS:
J'ai juste fait la même chose. En utilisant des promesses et alors la Promesse.toutes les synchroniser à la fin, vous pouvez faire plusieurs demandes simultanées, mais alors assurez-vous d'avoir tous les résultats avant de vous terminer.
Voir ici dans le dernier exemple:
http://javascriptrambling.blogspot.com/2017/04/to-promised-land-with-asyncawait-and.html
Le pseudo-code peut être écrit comme ci-dessous:
résultat-1, le résultat-2, suite-n va s'exécuter en parallèle.
combinedResult et lastResult continuera à fonctionner en parallèle.
Cependant combinedResult c'est à dire la valeur de retour de handleResults fonction sera rendue une fois le résultat-1 et 2 sont disponibles et lastResult valeur que j'ai.e handleLastResult sera rendue une fois le résultat n est disponible.
Espère que cette aide
Tout d'abord, sont votre code d'un blocage de code?
Si oui, rappelez-vous que javascript est seul thread, donc vous ne pouvez pas courir deux synchrone codes, par exemple, deux boucles (for ou while) en même temps.
Mais, il est possible de réaliser que l'utilisation des Web workers, j'ai réussi à exécuter des fonctions au générique de la web les travailleurs et sans l'aide séparés js fichiers.
JS: