gulp4.0报错The following tasks did not complete

2019-04-08218次阅读

在使用gulp4.0执行task的时候,会出现以下错误:

The following tasks did not complete: default
Did you forget to signal async completion?

其实在gulp Async Completion中已有很好的解释:

常见的异步处理方式有哪些?

node库以各种方式处理异步性。最常见的模式是error-first callbacks(错误优先回调),但您可能还会遇到streamspromisesevent emitterschild processes, or observables。Gulp任务规范化所有这些类型的异步性。

  • 当从任务中return返回stream, promise, event emitter, child process, or observable时,如果任务中出错,gulp会立即结束当前任务并显示错误
  • 当用series()按顺序执行任务,一个错误将结束整个顺序执行任务。使用parallel()最大并发性运行任务,错误将结束当前运行的任务,但其他并行任务可能完成,也可能不完成。

Returning a stream

const { src, dest } = require('gulp');

function streamTask() {
  return src('*.js')
    .pipe(dest('output'));
}

exports.default = streamTask;

Returning a promise

function promiseTask() {
  return Promise.resolve('the value is ignored');
}

exports.default = promiseTask;

Returning an event emitter

const { EventEmitter } = require('events');

function eventEmitterTask() {
  const emitter = new EventEmitter();
  // Emit has to happen async otherwise gulp isn't listening yet
  setTimeout(() => emitter.emit('finish'), 250);
  return emitter;
}

exports.default = eventEmitterTask;

Returning a child process

const { exec } = require('child_process');

function childProcessTask() {
  return exec('date');
}

exports.default = childProcessTask;

Returning an observable

const { Observable } = require('rxjs');

function observableTask() {
  return Observable.of(1, 2, 3);
}

exports.default = observableTask;

Using an error-first callback

如果任务没有返回任何内容,则必须使用error-first callbacks(错误优先回调)来表示完成。回调将作为下例中唯一名为cb()的参数传递给任务。

function callbackTask(cb) {
  // `cb()` should be called by some async work
  cb();
}

exports.default = callbackTask;

在任务中发生Error错误时,请使用错误作为唯一参数调用它。

function callbackError(cb) {
  // `cb()` should be called by some async work
  cb(new Error('kaboom'));
}

exports.default = callbackError;

但是,您通常会将此回调传递给另一个API,而不是自己调用它。

const fs = require('fs');

function passingCallback(cb) {
  fs.access('gulpfile.js', cb);
}

exports.default = passingCallback;

gulp4中不再支持同步任务。它们常常导致难以调试的细微错误,例如忘记从任务中return返回stream。或者当你看到“The following tasks did not complete:**,Did you forget to signal async completion?(下列任务未完成:**,你忘了信号异步完成了吗)”警告,说明上面的6种处理异步的方法你未使用。

使用 async/await模拟同步任务

如果不使用前面的任何选项方法,您可以将任务定义为async function,它将您的任务包装在promises中。这允许您使用await同步处理promise,并使用其他同步代码。

const fs = require('fs');

async function asyncAwaitTask() {
  const { version } = fs.readFileSync('package.json');
  console.log(version);
  await Promise.resolve('some result');
}

exports.default = asyncAwaitTask;

The following tasks did not complete: default,Did you forget to signal async completion?问题的解决方案是上面6种方法之一即可。

return promise演示一下

function sass(){
	return src('src/sass/!(reset|define).scss')
        .pipe(dest('build/css'));
};


function defaultTask() {
	// return Promis
	return new Promise(series(sass))
	
}

exports.default = defaultTask;

作者使用的是下面这个:

function sass(){
    return src('src/sass/!(reset|define).scss')
        .pipe(dest('build/css'));
}

exports.default = series(sass);

 

上一篇: gulp运行报错:Task function must be specified必须指定任务函数  下一篇: 多行文本显示省略号  

gulp4.0报错The following tasks did not complete相关文章