【发布时间】:2014-03-04 09:40:15
【问题描述】:
几年前,我在试验 NodeJS,发现"Step" 库很好地清理了我的一些代码。当希望更新该代码时,我注意到 Step 上有一些“危险信号”。 (几年没有更新,只有 32 次提交等)
于是我环顾四周,发现Async.js,它有更多的功能和积极的维护。
看起来不错,一般。但是我开始尝试应用转换来代替它,并且可能没有采取正确的角度。
如果我没看错的话,Step 的核心功能似乎就是 Async.JS 所称的"waterfall" pattern。所以在 Step 你会写:
Step(
function firstStepNoArgs() {
foo.asyncCall(this);
},
function secondStep(err, argFromFoo) {
if (err) {
handleError(err);
}
bar.asyncCall(argFromFoo, 1, this.parallel());
baz.asyncCall(argFromFoo, 2, this.parallel());
},
function thirdStep(err, argFromBar, argFromBaz) {
if (err) {
handleError(err);
}
/* etc... */
}
);
如果我不知道更好,我可能猜你会像这样在 async.js 中这样做 (未经测试,认为它是伪代码;我说的是我实际上没有追求的理论上的改变然而)
function thirdStep(argFromBar, argFromBaz) {
/* etc... */
}
async.waterfall([
function firstStepNoArgs(callback) {
foo.asyncCall(callback);
},
function secondStep(argFromFoo, callback) {
async.parallel([
barResult: function(callback) {
bar.asyncCall(parameterFromFoo, 1, callback);
},
bazResult: function(callback) {
baz.asyncCall(parameterFromFoo, 2, callback);
}
],
function(err, result) {
if (err) {
handleError(err);
} else {
thirdStep(result.barResult, result.bazResult);
}
}
}
],
function(err, result) {
if (err) {
handleError(err);
} else {
/* no-op? just assume third-step runs? */
}
}
);
Step 非常专注和连续,我的小草稿显示它在改编过程中变得混乱。我错过了什么吗?
所以我的问题是:将清晰的 Step 代码转换为 Async.JS 的正确方法是什么?还是我选择了错误的库来升级?我不想让我的代码变得更丑,但我也不想依赖一个看起来有点“死”的库。 :-/
【问题讨论】:
-
如果你正在切换库,你可能想看看 Q Promise 库,它也被大量使用(它是 npm 中 #11 最依赖的东西)。在 Youtube 上搜索 Q 的主要作者之一 Dominic Denicola 的用户组/会议演讲之一。你至少会得到一个很好的概述,并可以看看它是否更适合你的世界观。我发现它对我很有效。
-
@barry-johnson 非常有趣;看了看。 (显然他的名字拼写为“Domenic”。)如果你很熟悉,你能否顺便给我一个答案,说明它是否可以像阶梯模型一样干净地完成?我不喜欢 async.js 的地方在于它需要为后面的并行项目提前放置回调;它弄乱了代码。一个“Q 视角”可以满足我的期望......!
-
感谢更正名称。我实际上不想在他的名字中加上任何'e',所以我也总是更正他的姓氏。大声笑 - 我会在今天下午或晚上尝试做一个例子。你能澄清一下
this在你的原始步骤代码中是什么吗?正如它所读到的,我猜它是一个由 step 提供的回调函数,并假设this.parallel()再次是一个(专门的)回调,以支持 fork/join 类型的行为。我也会看一下步骤文档。 -
同时,如果它可能有帮助,我最近answered a question 其中包括一些数据库代码的功能相同的普通回调和启用承诺的版本。我对 Promise 版本进行了大量评论,因此它可能只是一个说明。
-
@barry-johnson 是的,你没看错; this.parallel 是 step 让您开始并行调用的方式,但在当前步骤中的所有调用完成之前,它不会进入下一步。在我的情况下,这就是我想要的……这实际上是关于代码“向下增长”而不是正确增长的基本问题,但我也希望保留序列顺序……!
标签: javascript node.js async.js