Gulp错误:以下任务未完成:您是否忘记信号异步完成?

334

我有以下的 gulpfile.js,我通过命令行 gulp message 来执行它:

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

1
如果您在这里是因为使用webpack-stream出现了问题,请使用以下链接:https://github.com/shama/webpack-stream/issues/34#issuecomment-478602446 - B3none
22个回答

4

这是您需要的内容: 没有同步任务.

没有同步任务

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

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

使用 async/await

当不使用前面的任何选项时,您可以将任务定义为一个async function,它将您的任务包装在一个承诺中。这允许您使用await同步地处理承诺并使用其他同步代码。

const fs = require('fs');

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

exports.default = asyncAwaitTask;

3
我解决了这个问题,只需添加以下代码片段即可。
var gulp = require('gulp');

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

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

3
我的解决方案:使用async和await的gulp来处理所有内容。
async function min_css() {
    return await gulp
        .src(cssFiles, { base: "." })
        .pipe(concat(cssOutput))
        .pipe(cssmin())
        .pipe(gulp.dest("."));
}

async function min_js() {
    return await gulp
        .src(jsFiles, { base: "." })
        .pipe(concat(jsOutput))
        .pipe(uglify())
        .pipe(gulp.dest("."));  
}

const min = async () => await gulp.series(min_css, min_js);

exports.min = min;


我认为.pipe不可等待。 - Connor Low

2
解决方案很简单,但我将列出我所做的更改,我遇到的错误,我的 gulpfile 更改前后以及包版本等内容,因此它看起来很长。
我通过遵循多个先前答案的指示解决了这个问题,还要根据每次保存 .scss 文件时输出的错误进行调整。
简而言之:
1. 我更改了 gulp-sass 的导入方式 - 参见 (A) 2. 将所有功能更改为 ASYNC 功能 - 参见 (B)
(A) gulp-sass 导入所做的更改:
1. 之前:var sass = require('gulp-sass) 2. 之后:var sass = require('gulp-sass')(require('sass'));
(B) 简单地将函数转换为 ASYNC -
我的 gulpfile 更改前的样子:
'use strict';
 
// dependencies
var gulp = require('gulp');
var sass = require('gulp-sass');
var minifyCSS = require('gulp-clean-css');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var changed = require('gulp-changed');
 
var SCSS_SRC = './src/Assets/scss/**/*.scss';
var SCSS_DEST = './src/Assets/css';
 
function compile_scss() {
    return gulp.src(SCSS_SRC)
        .pipe(sass().on('error', sass.logError))
        .pipe(minifyCSS())
        .pipe(rename({ suffix: '.min' }))
        .pipe(changed(SCSS_DEST))
        .pipe(gulp.dest(SCSS_DEST));
}
 
 
function watch_scss() {
    gulp.watch(SCSS_SRC, compile_scss);
}

gulp.task('default', watch_scss); //Run tasks
 
exports.compile_scss = compile_scss;
exports.watch_scss = watch_scss;

我的 gulpfile 在完成后的样子:

'use strict';
 
// dependencies
var gulp = require('gulp');
//var sass = require('gulp-sass');
var sass = require('gulp-sass')(require('sass'));
var minifyCSS = require('gulp-clean-css');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var changed = require('gulp-changed');

var SCSS_SRC = './src/Assets/scss/**/*.scss';
var SCSS_DEST = './src/Assets/css';
 
async function compile_scss() {
    return gulp.src(SCSS_SRC)
        .pipe(sass().on('error', sass.logError))
        .pipe(minifyCSS())
        .pipe(rename({ suffix: '.min' }))
        .pipe(changed(SCSS_DEST))
        .pipe(gulp.dest(SCSS_DEST));
}
 
async function watch_scss() {
    gulp.watch(SCSS_SRC, compile_scss);
}
 
gulp.task('default', watch_scss); // Run tasks
 
exports.compile_scss = compile_scss;
exports.watch_scss = watch_scss;

包版本:

"gulp": "^4.0.2",
"gulp-changed": "^4.0.3",
"gulp-rename": "^2.0.0",
"gulp-uglify": "^3.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-sass": "^5.0.0",
"sass": "^1.38.0"

我遇到的错误:

Error in plugin "gulp-sass"
Message:

gulp-sass 5 does not have a default Sass compiler; please set one yourself.
Both the `sass` and `node-sass` packages are permitted.
For example, in your gulpfile:

  var sass = require('gulp-sass')(require('sass'));

[14:00:37] The following tasks did not complete: default, compile_scss
[14:00:37] Did you forget to signal async completion?

1

我在使用Gulp 4时遇到了同样的错误,但解决方案不同。 我遇到了以下错误: “Did you forget to signal async completion?” 但在出现错误之前,它还说: “gulp-sass no longer has a default Sass compiler; please set one yourself” 起初我完全忽略了那部分内容。 所以我在gulfile.js中有这个:

const sass = require('gulp-sass')

这应该被更改为:

const sass = require('gulp-sass')(require('sass'));

现在它可以工作了。


1
在Gulp 4及以上版本中,所有Gulp任务都需要告诉Gulp任务何时结束。我们可以通过调用作为任务函数第一个参数传递的函数来实现这一点。
var gulp = require('gulp');
gulp.task('first_task', function(callback) {
  console.log('My First Task');
  callback();
})

这对我有用。并在“function”之前添加“async”。 - modernxart

1

最近我遇到了这个问题,找到了创建一个运行sass然后sass:watch的默认任务的正确方法:

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

0

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


0

0
对我来说,问题是不同的:Angular-cli没有安装(我使用NVM安装了新的Node版本,只是忘记重新安装angular cli)。
您可以通过运行“ng version”进行检查。
如果您没有它,只需运行“npm install -g @angular/cli”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接