javascript中的“完成”功能

时间:2015-07-24 07:09:27

标签: javascript

例如,我阅读了有关创建任务的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);
});

2 个答案:

答案 0 :(得分:3)

这是Grunt在执行异步工作时知道任务何时完成的唯一方法。

这个SO Post提供了很多关于JS中的异步以及如何使用它的细节。

基本上,setTimeout会在1秒后调用您的回调函数。但是,grunt不知道你的回调何时完成,因为setTimeout本身在调用后会立即返回。因此,done()函数可以为您提供一种告诉grunt您的任务完成的方法,无论何时都可以。

答案 1 :(得分:0)

Grunt内部有一个标志,用于确定在任务函数完成时是否应将任务标记为完成,或者是否应异步处理任务。默认情况下,Grunt会同步运行任务,this.async()调用会切换此标志。

"默认同步"设计决策可能是为了让简单的任务更容易编写,你可以使用fs.writeSync等,这绝对是一种有效的方法,尽管至少会妨碍我现在经常写的任务。

Grunt也是在Promise成为回调地狱的可行解决方案之前创建的,所以也是如此。

我很确定还有其他原因,我不知道:)