在节点中,使用 Q,使 2 个函数并行工作,但只等待第一个函数实现它的承诺

in node, using Q, make 2 functions work in parallel but wait only for the first one to fulfill its promise

在我的环境中,我使用 node +q(我不是这方面的专家),所以主要论点是:promises。

我有一个函数需要并行进行 2 个操作,一个很长,一个很短。

var parallelWrapper = function(input) {
  var deferred = Q.defer();
  var fastPromise = fastComputation()
    .then(function(data) {
        deferred.resolve(data)
      },
      function(err) {
        deferred.reject(err)
      });
  // of course this one below is not going to work properly
  var slowPromise = slowComputation()
    .then(function(data) {
      makeSomething();
    })
    .then(function(data) {
      makeSomethingElse();
    })
    .fail(function(err) {
      console.log(err);
    });

  Q.all([fastPromise, slowPromise]);

  retrun deferred.promise;
}

这个函数将在承诺链中调用,因为需要第一个操作的结果,而第二个操作的结果不需要。

var myLongChainOfFunctions = function() {
  var deferred = Q.defer();

  firstFunction(someParams)
    .then(secondFunction)
    .then(thirdFunction)
    /*...*/
    .then(parallelWrapper)
    .then(someFunction(data){
      /* Do Something with the data returned only by fastPromise*/
    }
    /*...*/
    .then(lastFunction)
    .fail(doSomething)

  return deferred.promise;

}

我想做的是让它们并行进行,但在 fastPromise 完成后立即解决,以便链式承诺可以向前推进,但显然在未来的某个时候我也想要 slowPromise完成。 所以我只希望 slowPromise 过好自己的生活,做自己该做的事情,不要太在意成败。

我的印象是 Q 不可能,但也许有一个我没有发现的解决方案。

我会这样做的:

var parallelWrapper = function(input) {

  var fastPromise = fastComputation();

  var slowPromise = slowComputation()
    .then(function(data) {
      return makeSomething();
    })
    .then(function(data) {
      return makeSomethingElse();
    }).catch(console.error);

  return Q([fastPromise, slowPromise]).all();
}

第二个例子是这样的:

var myLongChainOfFunctions = function() {

  return firstFunction(someParams)
    .then(secondFunction)
    .then(thirdFunction)
    /*...*/
    .then(parallelWrapper)
    /*...*/
    .then(lastFunction)
    .catch(doSomethingWithError)

}

好的,你可以这样做:

var parallelWrapper = function(input) { 
      slowComputation()
        .then(function(data) {
          return makeSomething();
        })
        .then(function(data) {
          return makeSomethingElse();
        }).catch(console.error);

      return fastComputation();
    }