如何同步运行Grunt任务(以编程方式)?

时间:2016-12-20 12:01:14

标签: javascript node.js asynchronous gruntjs

我想要一个在循环中同步运行子任务的任务,当子任务更改标志的值时,这样的循环就会中断。

以下是我尝试做的一个示例:

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没有完成,Grunt可以定义给定的task A失败(使用grunt.task.requires:{{1} })。

1 个答案:

答案 0 :(得分:2)

这是我们修复它的方式(遵循Bergi的评论的脚步):

不要试图在Grunt上显式循环和运行任务,最好使用Grunt的自然任务链机制来确保一个任务在另一个之后执行,如此

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

假设这样,我们在每个postTask的末尾使用递归来检查我们是否需要再次运行它(通过检查importantValue标志) - 我们通过自己的任务来实现这一点< / p>

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');
  }
});