例如,我阅读了有关创建任务的Grunt文档。在“任务可以是异步”部分,有一个“完成”功能的用例,我想知道为什么我们需要它。
grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
// Force task into async mode and grab a handle to the "done" function.
var done = this.async();
// Run some sync stuff.
grunt.log.writeln('Processing task...');
// And some async stuff.
setTimeout(function() {
grunt.log.writeln('All done!');
done();
}, 1000);
});
答案 0 :(得分:3)
这是Grunt在执行异步工作时知道任务何时完成的唯一方法。
这个SO Post提供了很多关于JS中的异步以及如何使用它的细节。
基本上,setTimeout
会在1秒后调用您的回调函数。但是,grunt不知道你的回调何时完成,因为setTimeout
本身在调用后会立即返回。因此,done()
函数可以为您提供一种告诉grunt您的任务完成的方法,无论何时都可以。
答案 1 :(得分:0)
Grunt内部有一个标志,用于确定在任务函数完成时是否应将任务标记为完成,或者是否应异步处理任务。默认情况下,Grunt会同步运行任务,this.async()
调用会切换此标志。
"默认同步"设计决策可能是为了让简单的任务更容易编写,你可以使用fs.writeSync等,这绝对是一种有效的方法,尽管至少会妨碍我现在经常写的任务。
Grunt也是在Promise成为回调地狱的可行解决方案之前创建的,所以也是如此。
我很确定还有其他原因,我不知道:)