q promise nodejs序列

时间:2016-08-09 12:45:31

标签: node.js promise q

我正在尝试运行一系列承诺。 我已经阅读了q kriskowal的github页面和他的序列示例,但他从未将之前的结果用于下一个承诺。

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

1 个答案:

答案 0 :(得分:0)

通过这样做:

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

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

您正在并行运行test()3次。因此,获取混合日志条目是正常的。

如果你想连续3次运行test(),你会这样做:

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

如果你想要所有运行的结果,改变test(),这样它接受一个数组并在完成时将结果推入其中,然后解析为同一个数组

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