2017-01-31 2 views
0

Disons que j'ai trois fonctions async:Javascript condition de course pour Promises

functionPromise1, functionPromise2, functionPromise3

Je veux tous les trois être appelés simultanément, avec les détails suivants:

  • Si functionPromise1 est rejetée, arrêter les deux autres fonctions de finition.
  • Si functionPromise2 et functionPromise3 finissent et sont résolus, passez à la partie suivante du code, mais si functionPromise1 est finalement rejetée, ne continuez pas dans le code. Si functionPromise2 ou functionPromise3 sont rejetées, ne passez pas à la partie suivante du code.

Mon cas d'utilisation de ces fonctions est que functionPromise1 sert de validation d'entrée que je veux faire synchrone avec d'autres fonctions qui traitent entrée comme cela a déjà validé afin d'accélérer mon processus. Cependant, si l'entrée est à tout moment trouvée invalide par functionPromise1, je veux terminer le code.

function functionPromise2(...){ 
    return new Promise(function(resolve,reject){ 
     fetchUrl(url, function(err, meta, body){ 
      if (err) { reject(err); } else { 
       if (body.toString().indexOf(text) !== -1){ 
        resolve(); 
       } else { 
        reject("Could not find quote"); 
       } 
      } 
     }); 
    }); 
} 

function functionPromise3(...) { 
    return new Promise(function(resolve,reject){ 
     var id = shortid.generate(); 
     var fileName = id+'.png'; 
     webshot(url, fileName, { shotOffset: {left: mouseX, top: mouseY} }, function(err) { 
      if (err) { reject(err); } else { 
       resolve({id: id, fileName: fileName}); 
      } 
     }); 
    }); 
} 
+0

Quand vous dites «synchrone», voulez-vous dire «concurrent»? parce que sinon la question n'a pas de sens. –

+0

@john_omalley Je veux dire concurrente. Je supposais qu'ils étaient synonymes. Je vais le changer maintenant – db2791

+0

@mhodges Cela ne veut-il pas dire qu'ils seraient exécutés de manière asynchrone? – db2791

Répondre

2

En ce qui concerne la « continuer à la prochaine partie du code », vous cherchez essentiellement Promise.all qui attend tout et rejette immédiatement s'il y a une erreur dans toute promesse:

return Promise.all([functionPromise1(), functionPromise2(), functionPromise3()]); 

Pour arrêter ce dernier deux processus quand functionPromise1() rejette, il n'y a rien que les promesses peuvent gérer pour vous, vous devrez le faire manuellement.

0

La réponse à cette question dépend vraiment de ce que font functionPromise2 et functionPromise3. Si les deux exécutent simplement, disons, une opération d'E/S, alors vous voulez juste utiliser Promise.all([f1, f2, f3]). S'ils sont plus impliqués (c'est-à-dire, plusieurs rappels), vous devrez garder l'état quelque part pour conserver le résultat de la première promesse et le vérifier pendant les étapes intermédiaires des deuxième et troisième promesses.

Vous ne pouvez pas vraiment avoir de vraies conditions de course en Javascript à un seul thread. Dans l'intérêt de la simplicité, je m'assurerais que la solution simple - le Promise.all ou f1.then(() => Promise.all([f2, f3]) - n'était pas assez bonne avant de la rendre plus complexe.