2014-11-29 3 views
0

Если я сделать следующее: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'); 
    }); 

ответ

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'); 
+0

Спасибо, На этот раз я понял. Обновлен мой вопрос. То, что это делало, заключалось в том, чтобы запускать задачи в очереди, поэтому вызов task2 из task1 имеет задачу 1 завершенную, но запущенная задача1 и task2 в task3 имеют task3, завершающую сначала, затем task1, а затем task2. – HMR

Смежные вопросы