1
votes

Parallèle vs série - Comment exécuter des fonctions en séquence avec Async

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


1 commentaires

c'est parce que votre fonction renvoie la valeur immédiatement, elle ne renvoie pas de résultat après un temps donné


5 Réponses :


2
votes

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 attend


0 commentaires

1
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires

1
votes

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


0 commentaires