如何在节点中执行此操作?

时间:2013-11-16 13:53:39

标签: node.js asynchronous flow-control

我有一项任务,如果已经完成,我已经完成了,我需要跳过它,如果没有,我需要执行它。任务是异步的。在此之后,我需要对另一个任务执行相同的检查,并可能执行它...

if(!taskStatus.complete[x])
  asyncTasks[x](function(result){
    if(!taskStatus.complete[y])
      asyncTasks[y](function(result){
        stow(result);
      });
  });
if(!taskStatus.complete[y])
  asyncTasks[y](function(result){
    stow(result);
  });

换句话说,无论第一个任务是否完成,都需要执行第二个任务,但如果要完成第一个任务,则第二个任务在完成之后才能执行。

我的代码在这里重复了很多,这通常是一件非常糟糕的事情。 Node的时尚性是不可避免的? Node太苛刻了吗?

1 个答案:

答案 0 :(得分:1)

你应该进入承诺(这里是good library that implements promises)。它们允许您优雅地表示代码的异步函数之间的依赖关系。

如果您将函数转换为使用promises,则以下是您的特定用例的示例:

getSomeX()
.then(getSomeY)
.then(function(result) {
    stow(result);
})

这很好地表明你只想在Y完成时调用stow(),并且Y首先需要X.

以下是一个示例(以及相应的tutorial子节使用延迟),了解如何将函数转换为使用promises:

var Q = require('q');
var getSomeX = function() {
    var deferred = Q.deferred();
    asyncTasks[x](function (result) {
        deferred.resolve(result);
    });
    return deferred.promise;
}

编辑:您还可以使用Q的能力自动转换一个异步函数,该函数尊重Node的常用回调样式(错误,结果)和denodeify功能:

var getSomeX = Q.denodeify(asyncTasks[x]);