首页 > gulp任务的先后问题

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

但是结果是这样的:


那是你的用法不对,因为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来看, 第三种方式比较适合你

【热门文章】
【热门文章】