Gulp任务中`return`语句和`callback`参考的目的

时间:2015-10-29 15:36:24

标签: javascript node.js asynchronous callback gulp

我无法让gulp run-sequence执行我给它的两个函数(它只会执行其中一个。我有类似的东西:

gulp.task('wire', function(){
  gulp.src('./index.html')
    .pipe(wiredep())
    .pipe(gulp.dest('.'));
});

var filesToInject = ['./app/**/*.js', './app/**/*.css'];
gulp.task('inject', function (){
  var target = gulp.src('./index.html');
  var sources = gulp.src(filesToInject, {read: false});
  return target.pipe(inject(sources))
    .pipe(gulp.dest('.'));
});

gulp.task('wire-inject',  function(callback){
    sequence('wire', 'inject', callback);
});

那只会运行inject任务。只有当我在return任务中gulp.src之前添加wire时才会执行。我还在函数参数中添加了回调,并将其传递到每个the documentation的两个任务中的最后一个管道。

gulp.task('wire', function(callback){
  gulp.src('./index.html')
    .pipe(wiredep())
    .pipe(gulp.dest('.'), callback);
});

var filesToInject = ['./app/**/*.js', './app/**/*.css'];
gulp.task('inject', function (callback){
  var target = gulp.src('./index.html');
  var sources = gulp.src(filesToInject, {read: false});
  return target.pipe(inject(sources))
    .pipe(gulp.dest('.'), callback);
});

这并没有引发任何错误,但是如果我把它拿出来它就不会改变任何东西。这个返回语句做了什么,神奇地使我的序列完全运行。文档中的这些回调是什么,我只是通过括号引用来执行它们?即使他们似乎什么都不做,我还需要他们吗?

1 个答案:

答案 0 :(得分:3)

Gulp需要知道异步任务何时完成。你有3种方法可以做到这一点:

  1. 返回一个事件流,这是您在任务函数中return gulp.src(...).pipe(...);时所执行的操作。

  2. 回复承诺。

  3. 让定义任务的函数采用参数。 Gulp将使用您应该在任务结束时调用的回调来调用您的函数。

  4. 如果你不这样做,那么Gulp将不会知道该任务是异步的。因此,只要函数返回,它就会考虑完成任务。这有各种各样的后果。 Gulp可以在任务完成之前退出。或者它可以在任务A完成之前启动依赖于任务A的任务B.在某些情况下,您可能不会立即看到 的问题,但随着您的gulpfile变得越来越复杂,您将有更多机会获得不良行为。 run-sequence并不特别:它需要知道任务何时完成才能正确完成工作。

    请注意,您在问题中显示的此代码中的callback无效:

    return target.pipe(inject(sources))
        .pipe(gulp.dest('.'), callback);
    

    callback将不会被调用。将其替换为function () { console.log("Hello!"); callback(); }。您不会在控制台上看到Hello!,因为未调用回调。但是,代码确实可以正常工作,因为您返回了流。 Gulp使用您返回的流来确定任务结束,而不是回调(永远不会被调用)。