【问题标题】:q promise nodejs sequenceq 承诺 nodejs 序列
【发布时间】:2016-08-10 02:45:11
【问题描述】:

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

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

【问题讨论】:

    标签: node.js promise q


    【解决方案1】:

    通过这样做:

    var b = [test(), test(),test()];
    
    Q.all(b)
    .then(function(result){
      console.dir(result);
    })
    

    您正在并行运行 test() 3 次。所以你得到混合的日志条目是正常的。

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

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

    【讨论】:

    • 感谢 redben 您的示例。所以现在更清楚了。但是我怎样才能在一个系列中动态运行一系列任务
    • tasks.reduce( function(lastPromise, task) { return lastPromise ? lastPromise.then(task) : task(resultHolder) } ).then(allDoneFunction)
    猜你喜欢
    • 2015-02-04
    • 2014-01-04
    • 2018-08-05
    • 2015-02-25
    • 2015-05-12
    • 1970-01-01
    • 2012-11-03
    • 2016-05-18
    • 2016-06-25
    相关资源
    最近更新 更多