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