Запуск задачи 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

Так есть ли какое-то волшебство вокруг того, как асинхронность должна работать в Джейке? так как кажется, что он каким-то образом запускает завершенное событие до того, как оно фактически завершит выполнение.

== РЕДАКТИРОВАТЬ ==

Просто, чтобы не было путаницы, я использую версию 0.5.16 Джейка https://github.com/mde/jake

== РЕДАКТИРОВАТЬ 2 ==

Опубликовал еще один пример, который теперь должен показывать точную проблему более четко, так как она, кажется, связана с задачами в рамках задач, которые являются асинхронными.

2 ответа

Кажется, что происходит изменение поведения (не уверен, что это ошибка или особенность) между узлами от 0,8 до 0,10. Задачи Jake, которые выполнялись последовательно в 0.8.14 (с async:true), похоже, запускаются одновременно в 0.10.x

Попробуйте удалить узел 0.10 и вместо него установить 0.8.

Я только что запустил это локально с тем же Джейком (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), поэтому давайте решим ее там, в этой проблеме. Минимальный пример работает правильно, поэтому в вашем скрипте сборки должно быть что-то конкретное. Давайте разберемся с некоторыми подробностями и постараемся разобраться с вами.:)

Другие вопросы по тегам