Gulp 中异步任务的处理

转自:http://www.hubwiz.com/exchange/56fa170692e7014f1931840d
如果你有多个任务,通常需要它们按照一定次序执行。比如:

var gulp = require("gulp");
gulp.task("task1",function(){ 
  setTimeout(function(){
    console.log("---------------task1---------------");  
  },2000);
});
gulp.task("task2",["task1"],function(){ 
  setTimeout(function(){
    console.log("---------------task2---------------");  
  },1000);
});
gulp.task("default",["task1","task2"],function(){
  console.log("---------------default task---------------");
});

你肯定期望,在默认任务default开始执行之前,任务task2执行已经确保执行完成;而任务task2开始执行前,也应当确保task1已经执行完成。

但是你执行上面的gulpfile.js,得不到你想要的结果。实际的结果恰恰相反:default task -> task2 -> task1

这是因为task1和task2都是异步的,gulp没法判断这些异步任务是否已经完成。除非,你使用以下三种办法之一:

1. 使用回调函数通知gulp任务完成

在定义一个gulp的任务时,gulp会传入一个回调函数作为参数,当你的任务完成时,调用这个回调函数,就可以通知gulp你的任务的确完成了:

var gulp = require("gulp");
gulp.task("task1",function(cb){ 
  setTimeout(function(){
    console.log("---------------task1---------------");  
    cb();
  },2000);
});
gulp.task("task2",["task1"],function(cb){ 
  setTimeout(function(){
    console.log("---------------task2---------------");  
    cb();
  },1000);
});
gulp.task("default",["task1","task2"],function(){
  console.log("---------------default task---------------");
});

2.让任务返回流

如果你定义的gulp任务,返回的是流(通常来讲,gulp的插件返回的都是流对象,这样才可以级联起来),那么gulp也可以确定你的任务何时执行完成,从而确保任务的先后执行顺序。这就是你说的情况。

3. 让任务返回Promise

如果你定义的gulp任务,返回的是Promise对象,那么gulp也可以确定你的任务何时执行完成,从而确保执行顺序:

var gulp = require("gulp");
var Promise = require("bluebird");
gulp.task("task1",function(){
  return new Promise(function(resolve,reject){
    setTimeout(function(){
      console.log("---------------task1---------------");  
      resolve();
    },2000);
  })
});
gulp.task("task2",["task1"],function(){ 
  return new Promise(function(resolve,reject){
    setTimeout(function(){
      console.log("---------------task2---------------");  
      resolve();
    },1000);  
  });
});
gulp.task("default",["task1","task2"],function(){
  console.log("---------------default task---------------");
});

总结:当gulp启动多个任务时,它默认是并发方式启动的。如果你希望各个任务以串行的方式执行,必须显式地用上面三种方式之一告诉gulp。

进一步参考:https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support
http://www.gulpjs.com.cn/docs/api/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值