【问题标题】:Jake task firing complete before completion of async taskJake 任务在异步任务完成之前完成
【发布时间】:2013-07-02 13:00:54
【问题描述】:

我在一个主要是 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 中的工作方式有什么魔力吗?因为它似乎在实际完成执行之前以某种方式触发了一个完整的事件。

== 编辑 ==

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

== 编辑 2 ==

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

【问题讨论】:

  • 谷歌搜索节点 Jake 获得了许多不同但相似的结果。您能否提供文档链接或 github 上的存储库名称。假设您正确使用该库,特别是 addListener 和调用函数,您的回调等看起来是合理的。
  • 这实际上只是我几个小时前完成的一个简单的本地 jake 项目。实际项目将 typescript 文件编译为 javascript,但上面的代码是一样的。所以不幸的是没有 github 链接或任何东西......我确实先尝试了谷歌搜索,但帖子和我的问题之间没有直接关联,大多数是关于如何使用 3rd 方库进行排序构建。一切似乎对我来说都很好,只是没有像我预期的那样运行:(

标签: javascript node.js asynchronous jake


【解决方案1】:

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

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

【讨论】:

  • 我正在运行 Node v0.10.12,最小示例可以正常工作。
【解决方案2】:

我只是用同一个 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),所以让我们在该问题上解决它。最小的示例可以正常工作,因此您的构建脚本必须有一些特定的内容。让我们了解更多细节并尝试让您解决问题。 :)

【讨论】:

  • 我已经用更清晰的示例更新了该问题,该示例展示了其他计算机上的行为,如果您有时间,我可以让您检查一下。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多