web-dev-qa-db-fra.com

Opérations parallèles avec Promise.all?

Je suis porté à croire que Promise.all exécute toutes les fonctions que vous lui transmettez en parallèle et ne se soucie pas de l'ordre dans lequel les promesses retournées se terminent.

Mais quand j'écris ce code de test:

function Promise1(){
    return new Promise(function(resolve, reject){
        for(let i = 0; i < 10; i++){
            console.log("Done Err!");
        }
        resolve(true)
    })
}

function Promise2(){
    return new Promise(function(resolve, reject){
        for(let i = 0; i < 10; i++){
            console.log("Done True!");
        }
        resolve(true)
    })
}

Promise.all([ 
    Promise1(),
    Promise2()
])
.then(function(){
    console.log("All Done!")
})

Le résultat que je reçois est ceci

Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done Err!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done True!
Done!

Mais s'ils fonctionnent en parallèle, ne puis-je pas s'attendre à ce qu'ils s'exécutent en même temps et me donnent un résultat comme celui-ci?

Done Err!
Done True!
Done Err!
Done True!
Done Err!
Done True!
Done Err!
Done True!
Etc. Etc.?

Ou est-ce que je manque quelque chose dans la façon dont je le fais?

8
Steve

C'est parce que vos promesses sont bloquantes et synchrones! Essayez quelque chose avec un délai d'attente au lieu d'une boucle synchrone:

function randomResolve(name) {
  return new Promise(resolve => setTimeout(() => {
    console.log(name);
    resolve();
  }, 100 * Math.random()));
}

Promise.all([ 
    randomResolve(1),
    randomResolve(2),
    randomResolve(3),
    randomResolve(4),
])
.then(function(){
    console.log("All Done!")
})
7
Johannes Merz

Un corps non asynchrone est exécuté en série Dès que vous atteignez un appel asynchrone dans votre corps (par exemple, cliquez sur une URL), les autres promesses du tableau commencent à s'exécuter.

0
Sanket Berde