Jika anda biasa dengan pengaturcaraan JavaScript sisi klien, anda mungkin telah menggunakan fungsi setTimeout dan setInterval, yang membenarkan kelewatan dalam menjalankan fungsi untuk satu tempoh masa. Contohnya, kod berikut, setelah dimuatkan ke dalam halaman web, akan menambahkan "Hello there" pada dokumen halaman selepas 1 saat:
setTimeout(function() {
document.write('
Hello.
');}, satuKedua);
Dan setInterval membenarkan fungsi dilaksanakan berulang kali pada selang waktu tertentu. Jika kod berikut disuntik ke dalam halaman Web, ia akan menyebabkan "Hello there" dilampirkan pada dokumen halaman setiap saat:
setInterval(function() {
document.write('
Hello.
'); }, satu Saat);
Oleh kerana Web telah lama menjadi platform untuk membina aplikasi, dan bukannya halaman statik yang mudah, keperluan sedemikian semakin muncul. Fungsi penjadualan tugas ini membantu pembangun melaksanakan pengesahan borang berkala, penyegerakan data jauh tertunda atau interaksi UI yang memerlukan respons tertunda. Node juga melaksanakan sepenuhnya kaedah ini. Di bahagian pelayan, anda boleh menggunakannya untuk mengulangi atau menangguhkan banyak tugas, seperti tamat tempoh cache, pembersihan kolam sambungan, tamat sesi, tinjauan pendapat, dsb.
Gunakan fungsi kelewatan setTimeout untuk melaksanakan
setTimeout boleh merumuskan pelan pelaksanaan untuk menjalankan fungsi yang ditentukan sekali pada masa hadapan, seperti:
console.log("tamat masa!");
}, tamat masa_ms);
setTimeout mengembalikan pemegang tamat masa, yang merupakan objek dalaman Anda boleh menggunakannya sebagai parameter untuk memanggil clearTimeout untuk membatalkan pemasa.
Gunakan clearTimeout untuk membatalkan rancangan pelaksanaan
Setelah anda memperoleh pemegang tamat masa, anda boleh menggunakan clearTimeout untuk membatalkan rancangan pelaksanaan fungsi, seperti ini:
console.log("tamat masa!");
}, tamat masa);
clearTimeout(timeout);
Dalam contoh ini, pemasa tidak akan dicetuskan, begitu juga perkataan "masa tamat!" Anda juga boleh membatalkan pelan pelaksanaan pada bila-bila masa pada masa hadapan, seperti dalam contoh berikut:
Buat dan batalkan rancangan pelaksanaan berulang untuk fungsi
setInterval adalah serupa dengan setTimeout, tetapi ia akan melaksanakan fungsi berulang kali pada selang waktu tertentu. Anda boleh menggunakannya untuk mencetuskan program secara berkala untuk menyelesaikan tugas seperti pembersihan, pengumpulan, pengelogan, pemerolehan data, pengundian, dsb. yang perlu dilakukan berulang kali.Kod berikut akan mengeluarkan "tanda" pada konsol setiap saat:
console.log("tandakan");
}, titik);
setInterval mengembalikan pemegang pelan pelaksanaan, yang boleh digunakan sebagai parameter clearInterval untuk membatalkan rancangan pelaksanaan:
}, 1000);
> // … clearInterval(selang);
Gunakan process.nextTick untuk menangguhkan pelaksanaan fungsi sehingga pusingan seterusnya bagi gelung acara
Kadangkala pengaturcara JavaScript pihak pelanggan menggunakan setTimeout(panggilan balik,0) untuk melengahkan tugasan untuk tempoh masa yang singkat Parameter kedua ialah 0 milisaat, yang memberitahu masa jalan JavaScript untuk menunggu serta-merta selepas semua acara yang belum selesai diproses. Jalankan fungsi panggil balik ini. Kadangkala teknik ini digunakan untuk melambatkan pelaksanaan operasi yang tidak perlu dilakukan segera. Sebagai contoh, kadangkala anda perlu mula bermain animasi atau melakukan beberapa pengiraan lain selepas acara pengguna diproses.
Dalam Node, sama seperti makna literal "gelung peristiwa", gelung peristiwa berjalan dalam gelung yang memproses baris gilir peristiwa Setiap pusingan proses kerja gelung peristiwa dipanggil tanda.
Anda boleh memanggil fungsi panggil balik sekali setiap kali gelung acara memulakan pusingan seterusnya (tanda seterusnya) pelaksanaan Ini betul-betul prinsip process.nextTick, dan setTimeout dan setTimeout menggunakan baris gilir pelaksanaan dalam masa jalan JavaScript, dan. Tidak menggunakan gelung acara.
Dengan menggunakan process.nextTick(panggilan balik) dan bukannya setTimeout(panggilan balik, 0), fungsi panggil balik anda akan dilaksanakan serta-merta selepas acara dalam baris gilir diproses, yang jauh lebih cepat daripada baris gilir tamat masa JavaScript (dalam masa CPU untuk mengukur ).
Anda boleh menangguhkan fungsi sehingga pusingan seterusnya gelung acara seperti berikut:
my_expensive_computation_function();
});
Nota: Objek proses ialah salah satu daripada beberapa objek global dalam Node.
Menyekat gelung acara
Waktu jalan Node dan JavaScript menggunakan gelung acara berbenang tunggal Setiap kali gelung, masa jalan memproses acara seterusnya dalam baris gilir dengan memanggil fungsi panggil balik yang berkaitan. Apabila acara dilaksanakan, gelung acara memperoleh hasil pelaksanaan dan memproses acara seterusnya, dan seterusnya sehingga baris gilir acara kosong. Jika salah satu fungsi panggil balik mengambil masa yang lama untuk dijalankan, gelung acara tidak akan dapat mengendalikan acara lain yang belum selesai pada masa itu, yang boleh menjadikan aplikasi atau perkhidmatan sangat perlahan.
Apabila memproses acara, jika fungsi sensitif memori atau sensitif pemproses digunakan, gelung acara akan menjadi perlahan dan sejumlah besar acara akan terkumpul, yang tidak dapat diproses dalam masa atau menyekat baris gilir.
Lihat contoh berikut menyekat gelung acara:
var a = 0;
manakala(benar) {
a ;
}
});process.nextTick(fungsi nextTick2() {
console.log("tanda seterusnya");
});
tetapkanMasa(fungsi tamat() {
console.log("masa tamat");
}, 1000);
Apabila menggunakan setTimeout, fungsi panggil balik akan ditambahkan pada baris gilir pelan pelaksanaan, dan dalam contoh ini fungsi tersebut tidak akan ditambahkan pada baris gilir. Ini adalah contoh yang melampau, tetapi anda dapat melihat bahawa menjalankan tugas intensif pemproses boleh menyekat atau memperlahankan gelung acara.
Keluar dari gelung acara
Menggunakan process.nextTick, anda boleh menangguhkan pelaksanaan tugas tidak kritikal ke tanda seterusnya bagi gelung acara, yang melepaskan gelung acara supaya ia boleh terus melaksanakan acara lain yang belum selesai.Lihat contoh di bawah Jika anda bercadang untuk memadamkan fail sementara, tetapi tidak mahu fungsi panggil balik peristiwa data menunggu operasi IO ini, anda boleh menangguhkannya seperti ini:
process.nextTick(function() {
fs.unlink("/path/to/file");
});
});
Andaikan anda bercadang untuk mereka bentuk fungsi yang dipanggil my_async_function, yang boleh melaksanakan operasi I/O tertentu (seperti menghurai fail log), dan berhasrat untuk membiarkannya dilaksanakan secara berkala Anda boleh menggunakan setInterval untuk melaksanakannya seperti ini:
setInterval(function() {
my_async_function(function() {
console.log('fungsi_async_saya selesai!');
});
}, selang);//Nota Penterjemah: “,selang” sebelumnya telah saya tambahkan, pengarang mungkin telah meninggalkannya kerana ralat tipografi
Nota Penterjemah: (Bahagian tebal di bawah ditambah oleh penterjemah dan bukan kandungan buku asal)
Untuk memudahkan pemahaman bahagian kandungan ini, anda boleh mengubah suai kod pengarang supaya ia sebenarnya boleh dijalankan:
(fungsi my_async_function(){
setTimeout(function(){
console.log("1");
},5000);
}, selang);
Jalankan kod ini dan lihat Anda akan mendapati bahawa selepas menunggu selama 5 saat, "hello" dikeluarkan setiap 1 saat. Jangkaan kami ialah selepas my_async_function semasa dilaksanakan (ia mengambil masa 5 saat), tunggu selama 1 saat sebelum melaksanakan my_async_function yang seterusnya harus ada selang 6 saat antara setiap output. Keputusan ini disebabkan oleh fakta bahawa my_async_function tidak dilaksanakan secara bersiri, tetapi berbilang yang dijalankan pada masa yang sama.