我有一项任务,如果已经完成,我已经完成了,我需要跳过它,如果没有,我需要执行它。任务是异步的。在此之后,我需要对另一个任务执行相同的检查,并可能执行它...
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太苛刻了吗?
答案 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]);