Если я сделать следующее:Run асинхронная задача и ждать его
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']);
};
Это позволяет мне либо позволить черновую запустить «myAsync» или запустить его из другой задачи и ждать.
Есть ли другой способ сделать это? Не удалось найти, как ждать асинхронных задач при вызове их из задачи.
[UPDATE]
Kyle меня на правильном пути, добавили 3 задачи; 1 drop db, 2, run test, 3 run tests и drop db. Поскольку задачи выполняются в очереди, третья задача должна только запускать другую 2. Вместо первой задачи (выполнить тесты) вызовите вторую задачу (drop db).
Это выглядит примерно так:
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');
});
Спасибо, На этот раз я понял. Обновлен мой вопрос. То, что это делало, заключалось в том, чтобы запускать задачи в очереди, поэтому вызов task2 из task1 имеет задачу 1 завершенную, но запущенная задача1 и task2 в task3 имеют task3, завершающую сначала, затем task1, а затем task2. – HMR