2016-08-06 7 views
1

Mein Programm hat die folgenden Fluss:Baukonstruktion Versprechen Flow aus json

Promise.resolve(phase_1) 
    .then(phase_2) 
    .then(phase_3) 
    .then(phase_4) 
    .catch(errorHandler); 

Aber ich möchte aber die Phasen in einem flow.json:

[ 
    "phase_1", 
    "phase_2", 
    "phase_3", 
    "phase_4", 
] 

Aber das gleiche Ergebnis erzielen. Ist es möglich?

Wie ich versuche zu:

let returning; 
flow.forEach(function(phase, index) => { 
    if (!index && !returning) { 
    returning = Promise.resolve(require(phase)); 
    } else { 
    returning.then(require(phase)); 
    } 
}); 

Dank !!!

+0

wenn diese Phasen nicht zusammen mit Bezug zu tun hatte können Sie tun 'phasePromises = Promise.all (phases.map (Phase => Promise.resolve (Phase)); phasePromises.then (onFulfillment, onFailure) ' – Redu

+0

Sie sind @Redu: / –

Antwort

0

Was Sie derzeit tun, ist äquivalent zu

let returning = Promise.resolve(phase); 
returning.then(flow[0]); 
returning.then(flow[1]); 
returning.then(flow[2]); 
returning.then(flow[3]); 

Um die tatsächlichen Verkettungs zu erhalten, müssen Sie returning = returning.then(…) in Ihrem Code zu tun. Sie können (und sollten) sie unter Verwendung reduce statt forEach (die auch das Problem behebt nicht tun die Initialisierung außerhalb der Schleife) eine Menge jedoch vereinfachen:

promise = flow.reduce(function(chain, phase) { 
    return chain.then(phase); 
}, Promise.resolve(phase)); 

Beachten Sie, dass phase erwartet wird, eine Funktion zu sein hier, also wenn flow wirklich von Strings besteht Sie wahrscheinlich

return chain.then(() => doSomething(phase)); 
-1

Wenn diese Phasen miteinander verknüpft sind, können Sie mithilfe von Promises und Generatoren einen Asyc-Workflow wie z. (Armer Mann Koroutine)

['1', '2', '3'].forEach(e => {function *iteration(index) { 
 
           // Some logic here 
 
           var val = yield Promise.resolve(index).then(v => { console.log(v); // do something with v 
 
                        it.next(v);  // async by the job queue 
 
                       }); 
 
           } 
 
           var it = iteration(e); 
 
           it.next(); // start the engine 
 
          });

Verwandte Themen