在完成异步任务之前完成Jake任务触发

时间:2013-07-02 13:00:55

标签: javascript node.js asynchronous jake

我正在测试Jake作为主要javascript项目的Rake的可能替代品。现在,我发现奇怪的一件事是在事件完成之前触发了完成事件。

以下是一个例子:

task('some_task_1', {async: true}, function () {
    console.log("|- Doing something");

    var execCallback = function() {
        console.log("  |- Done something");
        complete();
    };

    setTimeout(execCallback, 2000);
});

task('some_task_2', {async: true}, function () {
    console.log("|- Doing something else");

    var execCallback = function() {
        console.log("  |- Done something else");
        complete();
    };

    setTimeout(execCallback, 2000);
});

task('task_runner', {async: true}, function () {
    var firstTask = jake.Task['some_task_1'];
    var secondTask = jake.Task['some_task_2'];

    firstTask.addListener("complete", function() { secondTask.invoke(); });
    secondTask.addListener("complete", function() { complete(); });

    firstTask.invoke();
});

task('default', function () {
    jake.Task['task_runner'].invoke();
});

我原本预计输出会是:

|- Doing something
   |- Done something
|- Doing something else
   |- Done something else

但实际上我得到的是:

|- Doing something
|- Doing something else
   |- Done something
   |- Done something else

那么异步应该如何在杰克工作有一些魔力吗?因为它似乎以某种方式在实际完成执行之前触发了一个完整的事件。

==编辑==

就是这样,没有混淆我使用的是Jake的0.5.16版本 https://github.com/mde/jake

==编辑2 ==

已经发布了另一个示例,现在应该以更清晰的方式显示确切的问题,因为它似乎与异步任务中的任务有关。

2 个答案:

答案 0 :(得分:0)

在节点0.8到0.10之间似乎存在行为的变化(不确定它是否是错误或特征)。在0.8.14中顺序执行的jake任务(使用async:true)似乎在0.10.x中同时开始运行

尝试卸载节点0.10,然后安装0.8。

答案 1 :(得分:0)

我刚用同样的Jake(v0.5.16)在本地运行。我必须更正语法 - 你的opts对象之后需要一个逗号,我把命令作为true命令,这样才能运行:

task('some_task_1', {async: true}, function () {
    console.log("|- Doing something");

    var command = "true";
    jake.exec(command, {}, function(){
        console.log("   |- Completed doing something");
        complete();
    });
});

task('some_task_2', {async: true}, function () {
    console.log("|- Doing something else");

    var command = "true";
    jake.exec(command, {}, function(){
        console.log("   |- Completed doing something else");
        complete();
    });
});

task('some_task_root', {async: true}, function () {
    var firstTask = jake.Task['some_task_1'];
    var secondTask = jake.Task['some_task_2'];

    firstTask.addListener("complete", function() { secondTask.invoke(); });
    secondTask.addListener("complete", function() { complete(); });

    firstTask.invoke();
});

这就是我改变的全部,但我得到了正确的输出,而不是你所描述的:

$ jake some_task_root
|- Doing something
   |- Completed doing something
|- Doing something else
   |- Completed doing something else

看起来你也为此打开了一个GitHub问题(https://github.com/mde/jake/issues/202),所以让我们在那里解决问题。最小的示例正常工作,因此必须有一些特定于您的构建脚本的东西。让我们获取更多细节,并尝试让您整理出来。 :)