运行异步任务并等待它

时间:2014-11-29 17:00:09

标签: asynchronous gruntjs

如果我执行以下操作:

module.exports = function(grunt) {
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
  });
  grunt.registerTask('myAsync','An async test task',function(){
    var done = this.async();
    setTimeout(function(){
      console.log('This is my async task');
      done();
    },1000);
  });
  grunt.registerTask('myTask','A test task',function(){
    grunt.task.run('myAsync');
    console.log('This is my task');
  });
  grunt.registerTask('default', ['myTask']);
};

输出结果为:

Running "myTask" task
This is my task

Running "myAsync" task
This is my async task

所以'myTask'不等待'myAsync'完成。我希望'myTask'等待'myAsync'。提出以下但不确定这是否可行:

module.exports = function(grunt) {
  // Project configuration.
  grunt.myAsync = function myAsync(callback){
    var done = this.async();
    setTimeout(function(){
      console.log('This is my async task');
      callback();
      done();
    },1000);
  };
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
  });
  grunt.registerTask('myAsync','An async test task',function(){
    grunt.myAsync();
  });
  grunt.registerTask('myTask','A test task',function(){
    var done = this.async();
    console.dir(this);
    grunt.myAsync.call(this,function(){
      console.log('This is my task');
      done();
    });
  });
  // Default task(s).
  grunt.registerTask('default', ['myTask']);
};

它允许我让grunt运行'myAsync'或从另一个任务运行它并等待它。

还有另一种方法吗?从任务中调用异步任务时无法找到等待异步任务的方法。

[UPDATE]

凯尔让我走上正轨,增加了3项任务; 1 drop db,2,run test,3 run tests和drop db。由于任务在队列中运行,第三个任务只需运行另一个任务2.而不是让第一个任务(运行测试)调用第二个任务(删除数据库)。

它看起来像这样:

  grunt.registerTask('runtests','Runs the integration tests.',function(){
    var done = this.async();
    setTimeout(function(){
      console.log('ran the tests db');
      done();
    },100);
  });
  grunt.registerTask('dropdb','Drops the db.',function(){
    var done = this.async();
    setTimeout(function(){
      console.log('droped db');
      done();
    },100);
  });
  grunt.registerTask('dropandrun','Runs the integration tests.',function(){
    if(!grunt.option('nodrop')){
      grunt.task.run('dropsdb');
    }
    grunt.task.run('runtests');
  });

1 个答案:

答案 0 :(得分:1)

Grunt在队列中运行任务。因此,如果您使用grunt.task.run()在另一个任务中排队任务,它将在当前完成后运行该任务。

您可以创建自己的任务可以调用的函数和库,而不是向grunt实例本身添加方法。比如这样:

module.exports = function(grunt) {
  function myAsync(callback){
    setTimeout(function(){
      console.log('This is my async task');
      callback();
    },1000);
  }
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
  });
  grunt.registerTask('myAsync','An async test task',function(){
    myAsync(this.async());
  });
  grunt.registerTask('myTask','A test task',function(){
    var done = this.async();
    myAsync(function() {
      console.log('This is my task');
      done();
    });
  });
  grunt.registerTask('default', ['myTask']);
};

随着这些功能的增长,您可以将它们移动到自己的文件中,并按照以下方式使用它们:

// ./lib/myasync.js
module.exports = function(callback) {
  setTimeout(function() {
    console.log('This is my async function');
    callback();
  }, 1000);
};

...

// Gruntfile.js
var myAsync = require('./lib/myasync.js');