2016-12-20 4 views
2

Я хочу, чтобы задача, выполняющая подзадачи синхронно в цикле, и такой цикл прерывается, когда подзадача меняет значение флага.Как запускать задачи Grunt синхронно (программно)?

Вот пример того, что я пытаюсь сделать:

grunt.registerTask('complexTask', 'Run sub-tasks synchronously.', function() { 
    var value; 
    do { 
     // 'changeValueTask' task sets 'importantValue' 
     grunt.task.run(['preTask', 'changeValueTask', 'postTask']); 
     value = grunt.config('importantValue'); 
    } while (!value); 
    // ... end task 
}); 

То, что я хочу, чтобы выйти из этого

  • убедитесь, что каждый набор задач (['preTask', 'changeValueTask', 'postTask']) выполняется в порядке (последовательно)
  • и лучший способ вырваться из цикла

Можно ли это достичь?

Примечание: ближе всего я мог бы найти после некоторых исследований было то, что Grunt позволяет определить, что данный task B терпит неудачу, если task A не сделано (с grunt.task.requires: grunt.task.requires('A')).

+1

Не использовать цикл с рекурсивным подходом, вы можете сделать это асинхронно Что ж. – Bergi

ответ

2

Это, как мы установили его (следуя по стопам комментарий Берги в):

Вместо того, чтобы пытаться явно петлевые и запускать задачи на Грунта, то лучше всего использовать естественный механизм задачи, выстраивание Grunt для обеспечить одна задача выполняется за другим, как и

grunt.task.run(['preTask', 'changeValueTask', 'postTask']); 

Предполагая это, мы использовали рекурсию в конце каждого postTask, чтобы проверить, если нам нужно, чтобы запустить его снова (проверив importantValue флаг) - мы этого добиться с заданием само по себе

grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); 

grunt.registerTask('taskCheck', 'Recursive task.', function() { 
    var value = grunt.config('importantValue'); 
    if (value) { 
    // done... work with value 
    } else { 
    // keep running 
    grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); 
    } 
}); 

В качестве улучшения мы можем инициализировать всю эту рекурсию на задаче, чтобы избежать ненужного захламления и изолировать это поведение: захват петли

grunt.registerTask('runValueTask', 'Bootstrap to start recursion.', function() { 
    grunt.task.run(['preTask', 'changeValueTask', 'postTask', 'taskCheck']); 
}); 

grunt.registerTask('taskCheck', 'Recursive task.', function() { 
    var value = grunt.config('importantValue'); 
    if (value) { 
    // done... work with value 
    } else { 
    // keep running 
    grunt.task.run('runValueTask'); 
    } 
}); 
Смежные вопросы