如果我执行以下操作:
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');
});
答案 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');