当前位置: 首页 > 知识库问答 >
问题:

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

翟奇
2023-03-14
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?
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2

共有1个答案

金昂熙
2023-03-14

由于任务可能包含异步代码,因此必须在任务执行完毕时向gulp发出信号(=“异步完成”)。

在Gulp3.x中,你可以不这么做就逃走。如果您没有显式地发出异步完成的信号,gulp只会假设您的任务是同步的,并且任务函数一返回就完成了。GULP4.x在这方面更加严格。您必须明确地发出任务完成的信号。

你可以通过六种方式做到这一点:

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

gulp.task('message', function() {
  return gulp.src('package.json')
    .pipe(print(function() { return 'HTTP Server Started'; }));
});
gulp.task('message', function() { 
  return new Promise(function(resolve, reject) {
    console.log("HTTP Server Started");
    resolve();
  });
});
gulp.task('message', async function() {
  console.log("HTTP Server Started");
});

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

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

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

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

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

我从未使用过这种机制,但如果您使用的是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;
});
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;
});
 类似资料:
  • 问题内容: 我正在使用NodeJS在Firebase中执行一些异步过程。 我想在完成所有NodeJS进程执行任务时停止,而无需使用Ctrl + C命令。 我试图退出该过程,但是它会在所有执行完成之前运行。 如何执行所有异步任务,然后退出脚本? 问题答案: 首先,您的所有异步过程都应为promise,然后将所有这些promise封装在一个promise中,并在该promise解析时退出。像这样:

  •  说明 调用方法1: $.f2eAct.task(el,options); 函数说明: 该方法完成主要调用joinAndFinish完成任务,会根据接口返回的奖品类型显示不同文案,如卡玛、实物、谢谢参与等。 当获取的奖品数量大于1时,会默认触发 $(".js-package").click(); 事件,所以需要在JS里定义.js-package点击方法。 使用的时候需要在相应dom元素添加 da

  • 这可能是一个更巧妙的问题,但我在ViewComponent类中有以下方法 所以我的问题是我应该采取什么方法?让异步在那里与警告无关,还是有一个解决方案/修复这个警告?它对我的项目有那么大的影响吗? 谢了!

  • 问题内容: 因此,我一直在尝试Gulp,看看它在速度上与Grunt相比如何,我对结果印象深刻,但是我有一件事我不知道如何在Gulp中进行。 因此,我有这个任务来缩小HTML: buildMetaData对象具有我需要的自定义功能,以及为什么不能使用像gulp- changed这样的插件。我要弄清楚的是,在缩小完成后如何(如果可能)运行代码块来处理所有文件并成功运行。gulp有可能发生这种情况吗?

  • 当用户无法登录他们的帐户时,我正在尝试执行警报。也就是说,当我尝试使用下面的代码完成此操作时,我会抛出以下错误: 原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程[AsyncTask#1,5,main]内创建处理程序 我怎样才能解决这个问题?请参阅下面的代码。 登录活动

  • 问题内容: 我有一个非常简单和标准的PHP强制下载脚本。 我如何检查是否/何时完成下载以便在客户端通知用户?我什至不需要实时显示进度,我只对非常具体的事件感兴趣:“下载完成时”。根据我的研究,由于没有事件,因此似乎必须从服务器端确定它,而且我认为不可能拦截浏览器事件。 因此,似乎最好的选择是通过某种客户端/服务器端交互比较发送到总字节的字节。我该如何检查从服务器发送的字节以进行PHP强制下载?是否