D'après l'explication de Google docs sur Async, la fonction suivante nommée "parallel" devrait s'exécuter en parallèle, et la fonction nommée "series" devrait s'exécuter séquentiellement.
Explication des fonctions async sur les développeurs Google
Le parallèle devrait prendre 2 secondes pour terminer.
La série devrait durer 4 secondes.
Cependant, ils se terminent tous les deux en 2 secondes.
Pourquoi la série () ne prend-elle pas 4 secondes au total? Je m'attends à ce que la première minuterie se termine après 2 secondes, puis la deuxième minuterie pour terminer encore 2 secondes plus tard?
async function parallel() { function timer(time) { setTimeout(function(){ console.log(`Hello ${time}`) }, time); } let one = timer(2000); // Start a 2 second timer asynchronously⦠let two = timer(2000); // â¦meaning this timer happens in parallel. await one; // Wait 2 seconds for the first timer await two; // â¦by which time this time finishes around same time } parallel() // completes in 2 seconds
Pourquoi cela fonctionne en parallèle mais la série ne fonctionne pas dans série?
async function series() { function timer(time) { setTimeout(function(){ console.log(`Hello ${time}`) }, time); } await timer(2000); // Wait 2 seconds⦠await timer(2000); // â¦should wait another 2 seconds } series() // should take 4 seconds to complete, but only takes 2 seconds
5 Réponses :
L'opérateur await est utilisé pour attendre une promesse. Si vous faites en sorte que votre fonction de minuterie renvoie une promesse qui se résout lorsque le rappel de délai d'expiration est appelé, cela devrait fonctionner comme prévu.
Pour en savoir plus, cliquez ici: Promise a> attend
setTimeout ne renvoie pas une promesse qui pourrait être attendue. Il n'attend donc pas la fin de setTimeout. Par conséquent, les fonctions setTimeout sont ajoutées à la file d'attente et exécutées immédiatement en 2 secondes.
Si vous ajoutez une promesse, la deuxième minuterie s'exécutera après 4 secondes
Vous devez renvoyer Promise
et le résoudre plus tard
function delay(t, v) { return new Promise(function(resolve) { setTimeout(resolve.bind(null, v), t) }); }
Voici l'explication: en utilisant setTimeout sur la chaîne de promesses
Parce que dans votre cas, vous exécutez setTimeout
qui est exécuté immédiatement, puis setTimeout
suivant.
Ensuite, les deux minuteries sont exécutées en 2 secondes.
Utilisez Promise
comme dans l'exemple et obtiendra le résultat attendu
Dans vos deux exemples, vous devriez renvoyer la promesse de vérifier le parallélisme et le sérialisme de l'extrait de code.
Comme dans votre exemple actuel, wait attend seulement que la fonction soit exécutée, ce qui dans votre cas est, comme setTimeout retourne immédiatement afin de comprendre l'exemple, utilisez Promise
pour voir lequel renvoie la valeur à l'avenir.
function timer(time) { return new Promise((resolve, reject) => setTimeout(() => resolve(Date.now()), time), null); } async function parallel() { let d1 = timer(2000); let d2 = timer(2000); // here both the functions are invoked and after invoking them we are waiting await d1; await d2; } parallel()
En cas d'exécution parallèle
function timer(time) { return new Promise((resolve, reject) => setTimeout(() => resolve(Math.random()), time), null); } async function series() { await timer(2000); // Wait 2 seconds⦠await timer(2000); // â¦should wait another 2 seconds } series() // should take 4 seconds to complete, but only takes 2 seconds
c'est parce que votre fonction renvoie la valeur immédiatement, elle ne renvoie pas de résultat après un temps donné