gulp任务的先后问题

在执行gulp任务的时候经常会遇到上一个任务执行完毕再执行下一个任务
不知道应该如何处理
我用了一个插件写的代码 先后顺序不对
我希望是执行顺序是 a->a完成->b->b完成->c

var gulp         = require('gulp'),
        gulpSequence = require('gulp-sequence');


gulp.task('a',function(){
     setTimeout(function(){
         console.log('task a done...')
     },300)
});

gulp.task('b',function(){
     setTimeout(function(){
         console.log('task b done...')
     },200)
});

gulp.task('c',function(){
     setTimeout(function(){
         console.log('task c done...')
     },100)
});


gulp.task('default', gulpSequence('a', 'b', 'c'));

但是结果是这样的:
图片描述

阅读 4.8k
3 个回答

那是你的用法不对,因为task里都是异步行为,你得通知它做完。

var gulp = require('gulp'),
    gulpSequence = require('gulp-sequence');


gulp.task('a',function(cb){
     setTimeout(function(){
         cb();
         console.log('task a done...')
     },300)
});

gulp.task('b',function(cb){
     setTimeout(function(){
         cb();
         console.log('task b done...')
     },200)
});

gulp.task('c',function(cb){
     setTimeout(function(){
         cb();
         console.log('task c done...')
     },100)
});


gulp.task('default', gulpSequence('a', 'b', 'c'));

图片描述

参考资料 https://github.com/teambition/gulp-sequence
https://github.com/Platform-CUF/use-gulp

因为gulp的执行是异步的啊,并非阻塞。

注意看文档,

https://github.com/gulpjs/gulp/blob/master/docs/API.md

gulp.task(name[, deps], fn)

这里的 deps 是依赖,

你可以这样。

gulp.task(a, function(){
    xxxx
})

gulp.task(b,[a], function(){
   xxxx
})

这个时候 b的执行就是在 a之后,但是这种执行方式是有要求的:

Async task support

Tasks can be made asynchronous if its fn does one of the following:
Accept a callback

// run a command in a shell
var exec = require('child_process').exec;
gulp.task('jekyll', function(cb) {
  // build Jekyll
  exec('jekyll build', function(err) {
    if (err) return cb(err); // return error
    cb(); // finished task
  });
});
Return a stream

gulp.task('somename', function() {
  var stream = gulp.src('client/**/*.js')
    .pipe(minify())
    .pipe(gulp.dest('build'));
  return stream;
});


Return a promise

var Q = require('q');

gulp.task('somename', function() {
  var deferred = Q.defer();

  // do async stuff
  setTimeout(function() {
    deferred.resolve();
  }, 1);

  return deferred.promise;
});

看你使用 setTimeout来看, 第三种方式比较适合你

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题