我有以下gulpfile.js,我通过命令行gulp消息执行:

var gulp = require('gulp');

gulp.task('message', function() {
  console.log("HTTP Server Started");
});

我得到以下错误消息:

[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js
[14:14:41] Starting 'message'...
HTTP Server Started
[14:14:41] The following tasks did not complete: message
[14:14:41] Did you forget to signal async completion?

我在Windows 10系统上使用gulp 4。下面是gulp——version的输出:

[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2

当前回答

就是这样:没有同步任务。

无同步任务

不再支持同步任务。它们通常会导致难以调试的细微错误,比如忘记从任务中返回流。

当您看到“是否忘记发出异步完成信号?”警告,上面提到的技术都没有使用。您需要使用错误优先回调或返回流、承诺、事件发射器、子进程或可观察对象来解决该问题。

使用异步/等待

当不使用任何前面的选项时,您可以将任务定义为async函数,该函数将任务包装在promise中。这允许您使用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;

其他回答

对于那些试图使用gulp进行本地部署的人,下面的代码将有所帮助

var gulp = require("gulp");
var yaml = require("js-yaml");
var path = require("path");
var fs = require("fs");

//Converts yaml to json
gulp.task("swagger", done => {
    var doc = yaml.safeLoad(fs.readFileSync(path.join(__dirname,"api/swagger/swagger.yaml")));
    fs.writeFileSync(
        path.join(__dirname,"../yourjsonfile.json"),
        JSON.stringify(doc, null, " ")
        );
    done();
});

//Watches for changes    
gulp.task('watch', function() {
  gulp.watch('api/swagger/swagger.yaml', gulp.series('swagger'));  
});

这个工作!

在2021年2月18日的最新更新中,我在使用下面的旧解决方案后发现了这个问题,然后我在下一个gulp版本中使用以下方法来修复它。

文件:Package.json

...,
"devDependencies": {
        "del": "^6.0.0",
        "gulp": "^4.0.2",
      },
...

文件:gulpfile.js

const {task} = require('gulp');
const del = require('del');

async function clean() {
    console.log('processing ... clean');

    return del([__dirname + '/dist']);
}

task(clean)
...

老版本

gulp.task('script', done => {
    // ... code gulp.src( ... )
    done();
});

gulp.task('css', done => {
    // ... code gulp.src( ... )
    done();
});

gulp.task('default', gulp.parallel(
        'script',
        'css'
  )
);

我最近一直在努力解决这个问题,并找到了正确的方法来创建一个默认任务,运行sass然后sass:watch是:

gulp.task('default', gulp.series('sass', 'sass:watch'));

你需要做两件事:

在函数之前添加async。 用return开始函数。 Var gulp = require('gulp'); 饮而尽。Task ('message', async function() { 返回console.log("HTTP服务器已启动"); });

在默认函数中添加done作为参数。这样就行了。