2016-08-09 2 views
0

Я пытаюсь выполнить последовательность обещаний. Я прочитал страницу github q kriskowal и его пример последовательностей, но он никогда не использовал предыдущий результат для следующего обещания.q Обещание nodejs sequence

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

Так что мой код:

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); 
}) 

Выход:

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' ] 

Что я хочу:

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 

ответ

0

Делая это:

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

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

Вы используете test() 3 раза параллельно. Таким образом, вы получаете смешанные записи журнала.

Если вы хотите запустить тест() 3 раза в серии вы могли бы сделать:

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

Если вы хотите, чтобы результаты всех прогонов, тест изменения(), так как он принимает массив и толкает результат в это когда сделано, то решает тот же массив

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; 
    } 

Тогда:

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

Благодаря redben для примера. так что теперь это более ясно. Но как я могу динамически запускать массив задач в серии – CHelbig

+0

'' tasks.reduce (function (lastPromise, task) {return lastPromise? LastPromise.then (task): task (resultHolder)}). Then (allDoneFunction) '' – redben

Смежные вопросы