0

Je suis en train de mettre en œuvre le cas d'utilisation suivante:multiple chaîne promesse de dépendance

  1. J'ai une séquence de tâches de synchronisation
  2. Chaque tâche de synchronisation doit déclencher une tâche async
  3. tâches Async ne peuvent pas s'exécutent simultanément, de sorte que chacun attend à la fois son déclencheur (2) et l'achèvement de son prédécesseur.

enter image description here

Ma première idée était de convertir toutes les tâches (synchronisation & async) dans une promesse puis créer deux chaînes de promesse. Mais j'ai du mal à trouver un moyen d'implémenter la chaîne de tâches asynchrones avec une double dépendance.

Comment puis-je y parvenir?

+1

Êtes-vous à la recherche de ['Promise.all'] (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)? –

+0

Je sais à propos de Promise.all mais je ne comprends pas comment il va gérer un tel cas –

+0

Promise.all ne va pas aider dans cette situation ... semble que OP a besoin d'une méthode next() pour coller au fond de son alors() s ... – dandavis

Répondre

0

Vous avez seulement besoin d'une chaîne de promesse:

syncTask1(); 
var promise1 = asyncTask1(); // Triggers first async task 
syncTask2(); 
var promise2 = promise1.then(asyncTask2); 
syncTask3(); 
var promise3 = promise2.then(asyncTask3); 
... 

Bien sûr, vous voulez nommer vos tâches et promet de façon significative. Cela se comportera de façon identique à ce que, étant donné que JavaScript est un seul thread et toutes les tâches de synchronisation se termine avant la promesse de asyncTask1 peut résoudre:

syncTask1(); 
var promise1 = asyncTask1(); // Triggers first async task 
syncTask2(); 
syncTask3(); 
... 
var promise2 = promise1.then(asyncTask2); 
var promise3 = promise2.then(asyncTask3); 
... 
+0

Mais avec cette implémentation chaque asynctask est déclenché seulement par asynctask précédent. –

+0

@ChristopherCourtois Oui, c'est vrai, mais node.js est mono-thread pour que les tâches de synchronisation ne puissent pas être interrompues de toute façon. Si vos tâches de synchronisation sont rapides, cela ne devrait pas poser de problème. S'ils sont de longue durée, ils ne devraient peut-être pas être synchrones. – Paulpro

+0

Comme vous pouvez le voir dans le [illustration de flux] (http://i.stack.imgur.com/pMJiV.png) les tâches de synchronisation peuvent prendre plus de temps que les tâches asynchrones –

0

A partir du diagramme, il ressemble à Async2 et 3 dépendent de plus que fullfillment de la fonction de synchronisation relative,

en utilisant vos conventions de nommage Voici comment je ferais la chaîne des promesses:

   Synctask1 
       |  | 
      Sync2 Async1 
      |  \  | 
      Sync3 Async2(resolved with promiseAll[Async1, Sync2] 
       \  | 
       \ | 
       Async3(resolved with promiseAll[Async2, Sync3] 
+0

Je dois essayer, merci –

+0

Je ne parviens pas à écrire cela, –

+0

Pourriez-vous me donner un extrait montrant comment vous allez enchaîner Sync1, Sync2, Async1 et Async2? –

1

en fait, si vos « tâches de synchronisation » sont vraiment synchrones, vous pouvez simplement les exécuter de manière synchrone avant de commencer votre chaîne de tâches asynchrones et la condition que chaque "tâche asynchrone" s'exécute après sa "tâche de synchronisation" respective est trivialement satisfaite, car toutes les tâches asynchrones s'exécutent après toutes les tâches de synchronisation. Si vos "tâches de synchronisation" sont elles-mêmes asynchrones, ou fonctionnent de manière vraiment parallèle les unes aux autres (je ne connais pas le modèle de threading/concurrence d'ExtendScript), vous devez effectuer chacune des tâches "ou" async ") renvoient une promesse.

Vous pouvez construire votre réseau chaîne (graphique acyclique) des dépendances en utilisant Promise.all:

var syncResult1 = syncTask1(); 
var asyncResult1 = syncResult1.then(asyncTask1); 
var syncResult2 = syncResult1.then(syncTask2); 
var asyncResult2 = Promise.all([asyncResult1, syncResult2]).then(asyncTask2); 
var syncResult3 = syncResult2.then(syncTask3); 
var asyncResult3 = Promise.all([asyncResult2, syncResult3]).then(asyncTask3); 

(Si vos « tâches de synchronisation » ne doivent pas retourner les promesses, juste faire syncResult… = syncTask…(syncResult…))