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

Jake task firing complete before completion of async task

本文关键字:任务 Jake 异步      更新时间:2023-09-26

我正在一个主要是javascript的项目中测试Jake作为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中异步应该如何工作,是否有一些魔力?因为它似乎在实际完成exec之前以某种方式启动了一个完整的事件。

===编辑===

只是为了避免混淆,我使用的是Jake的0.5.16版本https://github.com/mde/jake

===编辑2===

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

节点0.8到0.10之间的行为似乎发生了变化(不确定是bug还是特性)。在0.8.14中按顺序执行的Jake任务(使用async:true)似乎在0.10.x 中开始并发运行

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

我刚刚用同一个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),所以让我们在问题上解决它。最小的例子工作正常,所以您的构建脚本必须有一些特定的东西。让我们来了解更多细节,并努力让您理清头绪。:)