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

Javascript Jake任务触发在异步任务完成之前完成,javascript,node.js,asynchronous,jake,Javascript,Node.js,Asynchronous,Jake,我正在测试Jake,作为Rake的一个可能替代者,它主要是一个javascript项目。现在我发现一件奇怪的事情是,完成事件在事件完成之前被触发 以下是一个例子: task('some_task_1', {async: true}, function () { console.log("|- Doing something"); var execCallback = function() { console.log(" |- Done something");

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

以下是一个例子:

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版本,这样就不会产生任何混乱

==编辑2==


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

节点0.8到0.10之间的行为似乎发生了变化(不确定是错误还是功能)。Jake任务在0.8.14中按顺序执行(异步: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问题,所以让我们在那里解决这个问题。最简单的示例工作正常,因此构建脚本中必须有特定的内容。让我们了解更多的细节,并尝试将您整理出来。:)

谷歌搜索节点Jake得到了许多不同但相似的结果。您可以在github上提供文档链接或存储库名称吗。假设您正确地使用了库,尤其是addListener,并像人们所认为的那样调用函数,那么您的回调和类似的调用看起来是合理的。这实际上只是我几个小时前完成的一个简单的本地jake项目。实际项目将typescript文件编译为javascript,但上面的代码完全相同。所以不幸的是,没有github链接或任何东西。。。我确实先尝试过谷歌搜索,但这些帖子和我的问题之间没有直接的联系,大多数都是关于如何使用第三方libs进行有序构建的。对我来说一切都很好,只是没有像我预期的那样运行:(我正在运行节点v0.10.12,最小的示例工作正常。我已经用一个更清晰的示例更新了这个问题,它展示了其他计算机上的行为,如果你有时间,我可以让你检查一下。