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é