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

时间:2016-04-27 18:20:07

标签: gulp

我有以下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

16 个答案:

答案 0 :(得分:304)

由于您的任务可能包含异步代码,因此您必须在任务执行完毕后发出gulp信号(=" async completion")。

在Gulp 3.x中,你可以在不这样做的情况下离开。如果你没有明确表示异步完成gulp会假设你的任务是同步的,并且一旦你的任务函数返回它就会完成。 Gulp 4.x在这方面更加严格。您必须明确表示任务完成。

您可以在six ways中执行此操作:

1。返回Stream

如果您只是尝试打印某些内容,这不是一个真正的选项,但它可能是最常用的异步完成机制,因为您通常使用gulp流。这是一个(相当人为的)示例,用于说明您的用例:

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

gulp.task('message', function() {
  return gulp.src('package.json')
    .pipe(print(function() { return 'HTTP Server Started'; }));
});

这里重要的部分是return声明。如果您不返回流,gulp无法确定流何时完成。

2。返回Promise

这是一个更适合您的用例的机制。请注意,大多数情况下您不必自己创建Promise对象,它通常由包提供(例如,经常使用的del包返回Promise )。

gulp.task('message', function() { 
  return new Promise(function(resolve, reject) {
    console.log("HTTP Server Started");
    resolve();
  });
});

使用async/await语法可以进一步简化。标记为async的所有函数都隐式返回Promise,因此以下内容也有效(如果您的node.js version supports it):

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

3。调用回调函数

对于您的用例,这可能是最简单的方法:gulp会自动将回调函数作为其第一个参数传递给您的任务。只需在完成后调用该功能:

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

4。返回child process

如果您必须直接调用命令行工具,这是非常有用的,因为没有node.js包装器可用。它适用于您的用例,但显然我不推荐它(特别是因为它不是非常便携):

var spawn = require('child_process').spawn;

gulp.task('message', function() {
  return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});

5。返回RxJS Observable

我从未使用过这种机制,但如果您使用RxJS,它可能会有用。如果你只想打印一些东西,那就太过分了:

var of = require('rxjs').of;

gulp.task('message', function() {
  var o = of('HTTP Server Started');
  o.subscribe(function(msg) { console.log(msg); });
  return o;
});

6。返回EventEmitter

就像上一篇文章一样,我为了完整起见而包含了这一点,但除非你已经使用EventEmitter,否则它并不是你真正想要使用的东西。某种原因。

gulp.task('message3', function() {
  var e = new EventEmitter();
  e.on('msg', function(msg) { console.log(msg); });
  setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
  return e;
});

答案 1 :(得分:29)

Gulp 4的问题-您需要明确地发信号通知任务完成以实现每个功能

要解决此问题,请尝试更改当前代码:

gulp.task('simpleTaskName', function() {
  // code...
});

例如:

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

答案 2 :(得分:10)

这行得通!

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

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

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

答案 3 :(得分:10)

从gulp第3版迁移到第4版时,这是一个问题。只需将完成的参数添加到回调函数中,请参见示例

   const gulp = require("gulp")

    gulp.task("message", function(done) {
      console.log("Gulp is running...")
      done()
    });

答案 4 :(得分:8)

您需要做一件事:

  • 在功能之前添加async

const gulp = require('gulp');

gulp.task('message', async function() {
    console.log("Gulp is running...");
});

答案 5 :(得分:4)

解决方法:我们需要调用回调函数(Task和Anonymous):

function electronTask(callbackA)
{
    return gulp.series(myFirstTask, mySeccondTask, (callbackB) =>
    {
        callbackA();
        callbackB();
    })();    
}

答案 6 :(得分:3)

尝试运行非常简单的SASS / CSS构建时,我遇到了同样的错误。

我的解决方案(可能会解决相同或相似的错误)只是在默认任务功能中添加“完成”作为参数,并在默认任务结束时调用它:

#!/usr/bin/env python3
# countasync.py

import asyncio

async def count():
    print("One")
    await asyncio.sleep(1)
    print("Two")

async def main():
    await asyncio.gather(count(), count(), count())

if __name__ == "__main__":
    import time
    s = time.perf_counter()
    asyncio.run(main())
    elapsed = time.perf_counter() - s
    print(f"{__file__} executed in {elapsed:0.2f} seconds.")

希望这会有所帮助!

答案 7 :(得分:2)

您需要做两件事;

  1. 在功能之前添加异步
  2. 从return开始功能

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

答案 8 :(得分:2)

我的解决方案:将所有内容放入异步并等待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;

答案 9 :(得分:1)

我不能声称自己对此有很深的了解,但是我有同样的问题并已解决。 通过使用异步功能,可以解决第七种问题。

编写函数,但添加前缀 async
这样,Gulp会将函数包装在一个Promise中,任务将无错误运行。

示例:

async function() {
  // do something
};

资源:

在gulp页面上的最后一部分“异步完成”,此处为“使用异步/等待”:

https://gulpjs.com/docs/en/getting-started/async-completion

Mozilla异步函数文档在这里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

答案 10 :(得分:0)

添加完成作为默认功能中的参数。会的。

答案 11 :(得分:0)

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

<!--[if !IE]>-->
<script src="script.js"></script>
<!--<![endif]-->

答案 12 :(得分:0)

您在这里:

https://gulpjs.com/docs/en/getting-started/async-completion#no-synchronous-tasks

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

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

使用异步/等待 当不使用任何先前的选项时,可以将任务定义为异步函数,该函数将任务包装在Promise中。这使您可以使用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;

答案 13 :(得分:0)

基本上,v3.X较为简单,但v4.x在同步和异步任务的这些方式上都非常严格。

异步/等待是了解工作流和问题的非常简单且实用的方法。

使用这种简单的方法

const gulp = require('gulp')

gulp.task('message',async function(){
return console.log('Gulp is running...')
})

答案 14 :(得分:0)

我最近在为此苦苦挣扎,发现创建运行$sql = "SELECT ban_id, timestamp, perp_steamid, perp_name, admin_steamid, admin_name, bantime, timeleft, reason FROM nomercyg_CTBan_Log"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr><td>". $row["ban_id"]. "</td><td>". date('m/d/Y h:i:s', $row["timestamp"]). "</td><td>". $row["perp_name"]. "</td><td>". $row["admin_name"]."</td><td>". $row["bantime"]." min". "</td><td>". $row["timeleft"]." min"."</td><td>". $row["reason"]. "</td></tr>"; } echo "</table>"; } else { echo "0 results"; } 然后default的{​​{1}}任务的正确方法是:

sass

答案 15 :(得分:0)

对我来说,问题有所不同:未安装Angular-cli (我使用NVM安装了新的Node版本,只是忘记了重新安装angular cli)

您可以检查正在运行的“ ng版本”。

如果没有,只需运行“ npm install -g @ angular / cli”