Saya memiliki gulpfile.js berikut , yang saya jalankan melalui pesan baris perintah gulp :
var gulp = require('gulp');
gulp.task('message', function() {
console.log("HTTP Server Started");
});
Saya menerima pesan galat berikut:
[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?
Saya menggunakan tegukan 4 pada sistem Windows 10. Ini adalah keluaran darigulp --version
:
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2
webpack-stream
. Gunakan ini: github.com/shama/webpack-stream/issues/…Jawaban:
Karena tugas Anda mungkin berisi kode asinkron, Anda harus memberi sinyal tegukan ketika tugas Anda telah selesai dijalankan (= "penyelesaian async").
Dalam Gulp 3.x Anda bisa pergi tanpa melakukan ini. Jika Anda tidak secara eksplisit mengisyaratkan penyelesaian async, hanya akan menganggap bahwa tugas Anda sinkron dan selesai segera setelah fungsi tugas Anda kembali. Gulp 4.x lebih ketat dalam hal ini. Anda harus secara eksplisit memberi sinyal penyelesaian tugas.
Anda dapat melakukannya dalam enam cara :
1. Kembalikan Stream
Ini sebenarnya bukan pilihan jika Anda hanya mencoba untuk mencetak sesuatu, tetapi itu mungkin mekanisme penyelesaian async yang paling sering digunakan karena Anda biasanya bekerja dengan aliran tegukan. Berikut adalah contoh (agak dibuat-buat) yang menunjukkannya untuk kasus penggunaan Anda:
Bagian penting di sini adalah
return
pernyataan. Jika Anda tidak mengembalikan aliran, tegukan tidak dapat menentukan kapan aliran selesai.2. Pengembalian a
Promise
Ini adalah mekanisme yang jauh lebih pas untuk kasus penggunaan Anda. Perhatikan bahwa sebagian besar waktu Anda tidak perlu membuat
Promise
objek sendiri, biasanya akan disediakan oleh paket (misalnya paket yang sering digunakandel
mengembalikan aPromise
).Menggunakan sintaks async / await ini dapat disederhanakan lebih jauh. Semua fungsi yang ditandai
async
secara implisit mengembalikan Janji sehingga hal berikut juga berfungsi (jika versi node.js Anda mendukungnya ):3. Panggil fungsi panggilan balik
Ini mungkin cara termudah untuk kasus penggunaan Anda: tegukan secara otomatis meneruskan fungsi panggilan balik ke tugas Anda sebagai argumen pertama. Panggil saja fungsi itu setelah selesai:
4. Mengembalikan a proses anak
Ini sebagian besar berguna jika Anda harus menjalankan alat baris perintah secara langsung karena tidak ada pembungkus node.js. Ini berfungsi untuk use case Anda tapi jelas saya tidak akan merekomendasikannya (terutama karena ini tidak terlalu portabel):
5. Kembalikan RxJS
Observable
.Saya tidak pernah menggunakan mekanisme ini, tetapi jika Anda menggunakan RxJS mungkin berguna. Agak berlebihan jika Anda hanya ingin mencetak sesuatu:
6. Kembalikan
EventEmitter
Seperti yang sebelumnya saya memasukkan ini untuk kelengkapan, tapi itu bukan sesuatu yang benar-benar akan Anda gunakan kecuali Anda sudah menggunakan
EventEmitter
karena suatu alasan.sumber
Masalah dengan Gulp 4 .
Untuk mengatasi masalah ini, cobalah untuk mengubah kode Anda saat ini:
misalnya dalam hal ini:
atau ke dalam ini:
sumber
Ini berhasil!
sumber
Saya mendapatkan kesalahan yang sama dengan mencoba menjalankan SASS / CSS build yang sangat sederhana .
Solusi saya (yang dapat mengatasi kesalahan yang sama atau serupa ini) adalah dengan menambahkan
done
sebagai parameter dalam fungsi tugas default, dan menyebutnya di akhir tugas default:Semoga ini membantu!
sumber
Anda perlu melakukan dua hal:
async
sebelum fungsi.Mulai fungsi Anda dengan
return
.sumber
Saya tidak bisa mengklaim sangat berpengetahuan tentang hal ini tetapi saya memiliki masalah yang sama dan telah menyelesaikannya.
Ada cara 7 untuk mengatasi ini, dengan menggunakan fungsi async .
Tulis fungsi Anda tetapi tambahkan awalan async .
Dengan melakukan ini Gulp membungkus fungsi dengan janji, dan tugas akan berjalan tanpa kesalahan.
Contoh:
Sumber:
Bagian terakhir pada halaman Gulp Completion Async : Menggunakan async / tunggu .
Mozilla async berfungsi sebagai dokumen .
sumber
Ini merupakan masalah ketika bermigrasi dari tegukan versi 3 ke 4, Anda cukup menambahkan parameter yang dilakukan ke fungsi panggil kembali, lihat contoh
sumber
Penanganan masalah: Kita perlu memanggil fungsi panggil balik (Tugas dan Anonim):
sumber
Ini dia: Tidak ada tugas yang sinkron .
Tidak ada tugas yang sinkron
Tugas sinkron tidak lagi didukung. Mereka sering menyebabkan kesalahan halus yang sulit di-debug, seperti lupa mengembalikan aliran Anda dari suatu tugas.
Ketika Anda melihat
Did you forget to signal async completion?
peringatan itu, tidak ada teknik yang disebutkan di atas yang digunakan. Anda harus menggunakan callback pertama-kesalahan atau mengembalikan aliran, janji, emitor acara, proses anak, atau diamati untuk menyelesaikan masalah.Menggunakan
async
/await
Ketika tidak menggunakan salah satu opsi sebelumnya, Anda dapat mendefinisikan tugas Anda sebagai
async function
, yang membungkus tugas Anda dengan janji . Ini memungkinkan Anda untuk bekerja dengan janji secara sinkron menggunakanawait
dan menggunakan kode sinkron lainnya.sumber
Pada dasarnya v3.X lebih sederhana tetapi v4.x ketat dalam hal tugas-tugas sinkron & asinkron ini.
The async / menunggu cukup sederhana & cara membantu untuk memahami alur kerja & masalah.
Gunakan pendekatan sederhana ini
sumber
Saya berjuang dengan ini baru-baru ini, dan menemukan cara yang tepat untuk membuat
default
tugas yang berjalansass
saatsass:watch
itu adalah:sumber
Solusi saya: letakkan semuanya dengan async dan tunggu tegukan.
sumber
Anda perlu melakukan satu hal:
async
sebelum fungsi.sumber
Tambahkan selesai sebagai parameter dalam fungsi default. Itu akan berhasil.
sumber
Bagi mereka yang mencoba menggunakan tegukan untuk penyebaran lokal, kode berikut akan membantu
sumber
Bagi saya masalahnya berbeda: Angular-cli tidak diinstal (saya menginstal versi Node baru menggunakan NVM dan hanya lupa menginstal ulang angular cli)
Anda dapat memeriksa menjalankan "versi ng".
Jika Anda tidak memilikinya, jalankan saja "npm install -g @ angular / cli"
sumber