Gulp エラー: 次のタスクは完了しませんでした: 非同期完了を通知するのを忘れましたか? 質問する

Gulp エラー: 次のタスクは完了しませんでした: 非同期完了を通知するのを忘れましたか? 質問する

次の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

ベストアンサー1

タスクには非同期コードが含まれている可能性があるため、タスクの実行が完了したら (=「非同期完了」)、gulp に信号を送る必要があります。

Gulp 3.x では、これを行わなくても問題ありません。非同期完了を明示的に通知しないと、gulp はタスクが同期しており、タスク関数が返されるとすぐに完了すると想定します。Gulp 4.x では、この点がより厳格になっています。タスク完了を明示的に通知する必要があります

それは6つの方法:

1. 返品するストリーム

これは、何かを印刷するだけの場合は実際には選択肢ではありませんが、通常は 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暗黙的にマークされたすべての関数はPromiseを返すので、次のコードも機能します(node.jsバージョンはこれをサポートしています):

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

3. コールバック関数を呼び出す

これはおそらく、あなたのユースケースにとって最も簡単な方法です。gulp はコールバック関数をタスクの最初の引数として自動的に渡します。完了したら、その関数を呼び出すだけです。

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

4. 返品する子プロセス

これは、node.js ラッパーが利用できないためにコマンドライン ツールを直接呼び出す必要がある場合に最も便利です。これはユースケースでは機能しますが、明らかにお勧めしません (特に移植性が低いため)。

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

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

5. 返品する翻訳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;
});

おすすめ記事