2017-06-07 2 views
-2

Ich versuche, auf Versprechen (die einige Ruhe API-Aufrufe auf jedem machen) zu laufen. Basierend auf dem Ergebnis der beiden Versprechen, verwenden Sie die dritte Funktion, um die Daten zu verarbeiten. Außerdem können sich die Funktionen ändern, die nacheinander ausgeführt werden. Also habe ich sie auf eine dynamische Weise dazu gebracht, Versprechen zu schaffen.Führen Sie JavaScript-Versprechungen in Reihenfolge aus. Einer nach dem anderen endet

Allerdings scheinen die Versprechen ohne die vorherige Ende zu beginnen. Hier ist ein vereinfachtes Modell zum Testen des gleichen Konzepts.

var funcs = [ 
 
\t() => { 
 
    console.log('Task 1 Sart =', new Date()); 
 
    \t sleeper(6000, 'Task 1 Resolved'); 
 
    console.log('Task 1 Return'); 
 
    }, 
 
() => { 
 
    console.log('Task 2 Sart=', new Date()); 
 
    \t sleeper(5000, 'Task 2 Resolved'); 
 
    console.log('Task 2 Return'); 
 
    }, 
 
() => { 
 
    console.log('Task 3 Start=', new Date()); 
 
    console.log('Task 2 Return'); 
 
    } 
 
]; 
 

 
function sleeper(m, msg) { 
 
\t return new Promise(function(resolve, reject) { 
 
    \t setTimeout(function() { 
 
    resolve(console.log(msg, new Date())); 
 
    \t }, m); 
 
\t }); 
 
} 
 

 
function runSequence(functionSequence) { 
 
    return functionSequence.reduce((p, func) => { 
 
     return p.then(func); 
 
    }, Promise.resolve()); 
 
} 
 

 
var v = runSequence(funcs);

Die Ergebnisse sehen wie dieses VM128: 51 Aufgabe 1 Sart = Mi 7. Juni 2017 13.54.34 GMT-0700 (PDT) VM128: 53 Aufgabe 1 Zurück VM128 : 56 Aufgabe 2 Sart = Wed Jun 07 2017 13:54:34 GMT-0700 (PDT) VM128: 58 Aufgabe 2 Zurück VM128: 61 Aufgabe 3 Start = Wed Jun 07 2017 13:54:34 GMT-0700 (PDT) VM128: 62 Aufgabe 2 Zurück VM238: 69 Aufgabe 2 gelöst Wed Jun 07 2017 13:54:39 ​​GMT-0700 (PDT) VM238: 69 Aufgabe 1 Gelöst Wed Jun 07 2017 13:54:40 GMT-0700 (PDT)

Ich würde annehmen, dass ich den zweiten Task erst sehen kann, wenn der erste beendet ist. Sah aus, als hätten sie alle nacheinander begonnen. Ist alles, was ich vermisst habe oder missverstehe ich, wie die Versprechen funktionieren. Was ich versucht habe zu erreichen, ist es, die erste abgeschlossen und dann beginnt die folgenden

+1

Keine 'Promise' oder andere Wert wird von Funktionen in' funs' Array zurückgegeben, IEG, 'Return Schläfer (6000, 'Aufgabe 1 gelöst'); ' – guest271314

+1

Ok. Ich sehe was du zeigst. Bei einer Rückgabe wird etwas in der Reihenfolge ausgeführt –

+0

_ "Die Frage ist nicht viel darüber, wo der Wert zurückgegeben wird." _ Ja, ist es. 'return' das' Promise' von der Funktion, sonst gibt es keine Möglichkeit festzustellen, dass die Aufgabe beim anonymen Funktionsaufruf abgeschlossen wurde, der eine asynchrone Prozedur durchführt. Sie sind in der Nähe, obwohl 'sleeper()' call, bei dem Sie ein 'Versprechen' zurückgegeben haben, nicht vom anonymen Funktionsaufruf zurückgegeben wird. Siehe auch https://stackoverflow.com/questions/44380582/wait-for-node-js-stream-readable-pipe-to-complete? – guest271314

Antwort

-2

Basierend auf den Kommentaren. Hier funktioniert die Version. Eine einfache Rückkehr von der ursprünglichen Codes fehlt

var funcs = [ 
 
\t() => { 
 
    console.log('Task 1 Sart =', new Date()); 
 
    \t return sleeper(7000, 'Task 1 Resolved');  
 
    }, 
 
() => { 
 
    \t console.log('Task 2 Sart=', new Date()); 
 
    \t return sleeper(3000, 'Task 2 Resolved'); 
 
    }, 
 
() => { 
 
    console.log('Task 3 Start=', new Date()); 
 
    console.log('Task 3 Return'); 
 
    } 
 
]; 
 

 
function sleeper(m, msg) { 
 
\t return new Promise(function(resolve, reject) { 
 
    \t setTimeout(function() { 
 
    resolve(console.log(msg, new Date())); 
 
    \t }, m); 
 
\t }); 
 
} 
 

 
function runSequence(functionSequence) { 
 
    return functionSequence.reduce((p, func) => {  
 
    return p.then(func); 
 
    }, Promise.resolve()); 
 
} 
 

 
runSequence(funcs);

Verwandte Themen