2016-08-09 59 views
0

Ich versuche, eine Reihe von Versprechen zu führen. Ich habe die Github-Seite von q kriskowal und sein Beispiel von Sequenzen gelesen, aber er hat nie das vorherige Ergebnis für das nächste Versprechen verwendet.q Versprechen nodejs Sequenz

return foo(initialVal).then(bar).then(baz).then(qux); 

So ist mein Code:

var Q = require('Q'); 
function foo(arg) { 
    console.log('foo arg=' + arg); 
    var d = Q.defer(); 
    bar(arg+1) 
    .then(function(){ 
     d.resolve(arg); 
    }, function(error){ 
     d.reject(error); 
    }) 

    return d.promise; 
} 
function bar(arg) { 
    console.log('bar arg=' + arg); 
    var d = Q.defer(); 
    d.resolve(arg); 
    return d.promise; 
} 

function test() { 
    var defer = Q.defer(); 
    foo('a') 
    .then(function (success) { 
     var def1 = Q.defer(); 
     console.dir('success: ' + success); 
     bar('test'); 
    }) 
    .then(function (rest) { 
     return foo('b') 
    }) 
    .then(function(success){ 
     defer.resolve(success); 
    }, function(error){ 
     defer.reject(error); 
    }); 

    return defer.promise; 
} 


var b = [test(), test(),test()]; 

Q.all(b) 
.then(function(result){ 
    console.dir(result); 
}) 

Die Ausgabe lautet:

foo arg=a 
bar arg=a1 
foo arg=a 
bar arg=a1 
foo arg=a 
bar arg=a1 
'success: a' 
bar arg=test 
'success: a' 
bar arg=test 
'success: a' 
bar arg=test 
foo arg=b 
bar arg=b1 
foo arg=b 
bar arg=b1 
foo arg=b 
bar arg=b1 
[ 'b', 'b', 'b' ] 

Was ich will, ist:

foo arg=a 
bar arg=a1 
'success: a' 
bar arg=test 
foo arg=b 
bar arg=b1 

foo arg=a 
bar arg=a1 
'success: a' 
bar arg=test 
foo arg=b 
bar arg=b1 

foo arg=a 
bar arg=a1 
'success: a' 
bar arg=test 
foo arg=b 
bar arg=b1 

Antwort

0

Damit verfolgt:

var b = [test(), test(),test()]; 

Q.all(b) 
.then(function(result){ 
    console.dir(result); 
}) 

Sie führen test() dreimal parallel durch. Es ist also normal, dass Sie gemischte Protokolleinträge erhalten.

Wenn Sie ausführen Test wollen() 3-mal in Serie würden Sie tun:

test().then(test).then(test) 
.then(function(result){ 
    // result is the result of the 3d run 
    console.dir(result); 
}) 

Wenn Sie die Ergebnisse aller Läufe, Wechseltest() wollen so wie es ein Array akzeptiert und schiebt führen in es, wenn sie fertig, löst dann zu dem gleichen Array

function test(results) { 
    var defer = Q.defer(); 
    foo('a') 
     .then(function (success) { 
      console.dir('success: ' + success); 
      return bar('test'); 
     }) 
     .then(function (rest) { 
      return foo('b') 
     }) 
     .then(function(success){ 
      results.push(success); 
      defer.resolve(results); 
     }, function(error){ 
      defer.reject(error); 
     }); 
    return defer.promise; 
    } 

dann:

var resultsHolder = []; 
test(resultsHolder).then(test).then(test) 
.then(function(r){ 
    // r === resultHoler 
    console.dir(r); 
}) 
+0

Vielen Dank für Ihr Beispiel redben. So, jetzt ist es klarer. Aber wie kann ich eine Reihe von Aufgaben dynamisch in einer Reihe – CHelbig

+0

'tasks.reduce (Funktion (lastPromise, Aufgabe)) {return lastPromise? LastPromise.then (Aufgabe): Aufgabe (resultHolder)}) .then (allDoneFunction) "" – redben