[我想要一个在循环中同步运行子任务的任务,并且当子任务更改标志的值时,这样的循环就会中断。
这里是我要做的事的样本:
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']
)依次运行”可以实现吗?
注:经过研究后,我能找到的最接近的结果是,如果未完成task B
(使用task A
:grunt.task.requires,Grunt可以定义给定的grunt.task.requires('A')
失败。
这是我们修复它的方式(遵循Bergi的评论):
而不是试图在Grunt上显式循环和运行任务,最好使用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');
}
});