Rumah hujung hadapan web tutorial js Penjelasan terperinci tentang menggunakan pemasa untuk melaksanakan fungsi secara kerap dalam Node.js_node.js

Penjelasan terperinci tentang menggunakan pemasa untuk melaksanakan fungsi secara kerap dalam Node.js_node.js

May 16, 2016 pm 04:39 PM
node.js pemasa

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:

Salin kod Kod adalah seperti berikut:

var oneSecond = 1000 * 1; // satu saat = 1000 x 1 ms

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:

Salin kod Kod adalah seperti berikut:

                var oneSecond = 1000 * 1; // satu saat = 1000 x 1 ms

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:

Salin kod Kod adalah seperti berikut:

                      var timeout_ms = 2000; var tamat masa = setTimeout(fungsi() {

console.log("tamat masa!");

                 }, tamat masa_ms);


Sama seperti JavaScript sisi klien, setTimeout menerima dua parameter Parameter pertama ialah fungsi yang perlu ditangguhkan dan parameter kedua ialah masa tunda (dalam milisaat).

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:


Salin kod Kod adalah seperti berikut:
                    var tamat Masa = 1000;
var tamat masa = setTimeout(fungsi() {

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:

Salin kod Kod adalah seperti berikut:

var tamat masa = setMasa tamat(fungsi A() {

console.log("tamat masa!");

                      }, 2000);

                                       setTimeout(fungsi B() {

                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
                     }, 1000);

Kod tersebut menentukan dua fungsi pelaksanaan tertunda A dan B. Fungsi A dijadualkan untuk dilaksanakan selepas 2 saat, dan B dijadualkan untuk dilaksanakan selepas 1 saat, kerana fungsi B dilaksanakan terlebih dahulu dan ia membatalkan rancangan pelaksanaan A. jadi A tidak akan lari.

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:


Salin kod Kod adalah seperti berikut:
                tempoh var = 1000;
setInterval(function() {

console.log("tandakan");

             }, titik);


Jika anda tidak mahu ia berjalan selama-lamanya, anda boleh menggunakan clearInterval() untuk membatalkan pemasa.

setInterval mengembalikan pemegang pelan pelaksanaan, yang boleh digunakan sebagai parameter clearInterval untuk membatalkan rancangan pelaksanaan:

                var interval = setInterval(function() {

console.log("tandakan");

             }, 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:

Salin kod Kod adalah seperti berikut:

process.nextTick(function() {

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:

Salin kod Kod adalah seperti berikut:

process.nextTick(fungsi nextTick1() {

var a = 0;

manakala(benar) {

a ;

                                                                                                                                                                                                                      }

             });

process.nextTick(fungsi nextTick2() {

console.log("tanda seterusnya");

             });

tetapkanMasa(fungsi tamat() {

console.log("masa tamat");

             }, 1000);


Dalam contoh ini, fungsi nextTick2 dan tamat masa tidak mempunyai peluang untuk dijalankan tidak kira berapa lama ia menunggu, kerana gelung peristiwa disekat oleh gelung tak terhingga dalam fungsi nextTick Walaupun fungsi tamat masa dijadualkan untuk dilaksanakan selepas itu 1 saat, ia tidak akan berjalan.

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:


Salin kod Kod adalah seperti berikut:
                   stream.on("data", function(data) {
stream.end("respons saya");

process.nextTick(function() {

fs.unlink("/path/to/file");

                                                                                    });

             });


Gunakan setTimeout dan bukannya setInterval untuk memastikan keseriusan pelaksanaan fungsi

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:

Salin kod Kod adalah seperti berikut:

              selang var = 1000;

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


Anda mesti dapat memastikan bahawa fungsi ini tidak akan dilaksanakan pada masa yang sama, tetapi anda tidak boleh menjamin ini jika anda menggunakan setinterval Jika fungsi my_async_function mengambil masa satu milisaat lebih lama daripada pembolehubah selang untuk dijalankan, ia akan dilaksanakan. pada masa yang sama dan bukannya mengikut urutan.

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:

Salin kod Kod adalah seperti berikut:
              selang var = 1000;
setInterval(function(){

(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.

Oleh itu, anda memerlukan cara untuk memaksa selang antara penghujung satu pelaksanaan my_async_function dan permulaan my_async_function seterusnya tepat pada masa yang ditentukan oleh pembolehubah selang. Anda boleh melakukan ini:


Salin kod Kod adalah seperti berikut:

                  selang var = 1000; (jadual fungsi() { //Baris 3

setTimeout(function do_it() {

my_async_function(function() { //Baris 5

console.log('async is done!');

jadual();

                                                                                                                                                                                                                                                                                      

                            }, selang);

                    }());

Dalam kod sebelumnya, fungsi yang dipanggil jadual diisytiharkan (baris 3), dan ia dipanggil serta-merta selepas pengisytiharan (baris 10 Fungsi jadual akan menjalankan fungsi do_it selepas 1 saat (dinyatakan mengikut selang). Selepas 1 saat, fungsi my_async_function pada baris 5 akan dipanggil Apabila ia selesai melaksanakan, fungsi panggil balik tanpa nama sendiri (baris 6) akan dipanggil dan fungsi panggil balik tanpa nama ini akan menetapkan semula pelan pelaksanaan do_it, biarkan ia dilaksanakan semula selepas 1 saat, supaya kod mula dilaksanakan secara bersiri dan berterusan dalam gelung.

Ringkasan

Anda boleh menggunakan fungsi setTimeout() untuk pratetap pelan pelaksanaan fungsi dan gunakan fungsi clearTimeout() untuk membatalkannya. Anda juga boleh menggunakan setInterval() untuk melaksanakan fungsi secara berkala secara berulang, anda boleh menggunakan clearInterval() untuk membatalkan pelan pelaksanaan berulang ini. Jika gelung peristiwa disekat dengan menggunakan operasi sensitif pemproses, fungsi yang pada asalnya dijadualkan untuk dilaksanakan akan ditangguhkan atau bahkan tidak akan dilaksanakan. Oleh itu, jangan gunakan operasi sensitif CPU di dalam gelung acara. Selain itu, anda boleh menggunakan process.nextTick() untuk menangguhkan pelaksanaan fungsi sehingga lelaran seterusnya bagi gelung peristiwa.

Apabila I/O digunakan dengan setInterval(), anda tidak boleh menjamin bahawa hanya terdapat satu panggilan yang belum selesai pada bila-bila masa Walau bagaimanapun, anda boleh menggunakan fungsi rekursif dan fungsi setTimeout() untuk mengelakkan masalah rumit ini.

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menetapkan berbilang pemasa pada iPhone iOS 17 Bagaimana untuk menetapkan berbilang pemasa pada iPhone iOS 17 Sep 18, 2023 am 09:01 AM

Dalam iOS 17, anda boleh menetapkan berbilang pemasa pada iPhone anda menggunakan apl Jam atau menggunakan Siri untuk menetapkannya bebas tangan. Kami membincangkan kedua-duanya dalam artikel ini. Mari kita lihat mereka. Tetapkan Berbilang Pemasa pada iPhone Menggunakan Apl Jam Buka apl Jam pada iPhone anda dan ketik tab Pemasa di penjuru kanan sebelah bawah. Sekarang, tetapkan jam, minit dan saat. Anda boleh menggunakan pilihan "Label" dan "Bilakah pemasa tamat" untuk menetapkan nama pemasa dan nada pilihan apabila pemasa selesai. Ini akan membantu anda membezakan antara pemasa. Setelah selesai, klik butang "Mula". Kemudian, klik pada ikon "+" di penjuru kanan sebelah atas. Sekarang, ulangi langkah di atas untuk menetapkan berbilang pemasa pada iPhone. Anda juga boleh menyemak imbas

Artikel tentang kawalan memori dalam Node Artikel tentang kawalan memori dalam Node Apr 26, 2023 pm 05:37 PM

Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Cara menggunakan berbilang pemasa pada iPhone dengan iOS 17 Cara menggunakan berbilang pemasa pada iPhone dengan iOS 17 Jun 21, 2023 am 08:18 AM

Apakah pemasa berbilang pada iOS17? Dalam iOS17, Apple kini menawarkan pengguna keupayaan untuk menetapkan berbilang pemasa sekaligus pada iPhone mereka. Ini adalah satu perubahan yang dialu-alukan, yang ditunggu-tunggu ramai selama bertahun-tahun. Apl Jam, yang sebelum iOS 16 hanya membenarkan pengguna menetapkan satu pemasa pada satu masa, kini boleh digunakan untuk mengaktifkan sebarang bilangan pemasa, menjadikannya sesuai untuk menyelesaikan berbilang tugas sekaligus. Anda boleh menetapkan sebarang bilangan pemasa dalam skrin pemasa. Setelah pemasa dimulakan, semua pemasa aktif akan muncul sebagai pemberitahuan "Aktiviti Langsung" pada skrin kunci dan Pusat Pemberitahuan. Dari sini, anda boleh melihat baki masa sehingga pemasa dimatikan, jeda atau hentikan pemasa tanpa membuka apl Jam. apabila anda berada pada jam

Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Mar 29, 2023 pm 06:02 PM

Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Pengenalan lokasi pemasa Windows 7 Pengenalan lokasi pemasa Windows 7 Jul 08, 2023 pm 11:53 PM

Di manakah pemasa dalam windows 7? Sesetengah pelanggan ingin tahu di mana kiraan detik dalam win7 apabila menggunakan win7 sebenarnya, win7 tidak mempunyai pemasa sendiri, tetapi ada jam yang boleh merekodkan masa ke lokasi pemasa dalam tingkap 7. Mula-mula, mengikut personaliti Bukanya, kemudian cari pilihan dalam bar tugas dan bar menu, kemudian sesuaikan dengan Acura, cari jam, dan pilih Buka, supaya anda boleh meneruskan ke teknologi melalui jam. Sangat mudah dan cepat. Di manakah pemasa dalam Windows 7? Apabila skrin komputer kosong, klik kanan dan pilih "Peribadikan". Pilih pilihan "Bar Tugas dan Bar Menu" Selepas membukanya, dalam tab bar tugas, terdapat kawasan bar status Klik butang tersuai dan klik "Buka" di bawah.

Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Nov 16, 2022 pm 08:34 PM

Node 19 telah dikeluarkan secara rasmi Artikel ini akan memberi anda penjelasan terperinci tentang 6 ciri utama Node.js 19. Saya harap ia akan membantu anda!

Mari bercakap secara mendalam tentang modul Fail dalam Node Mari bercakap secara mendalam tentang modul Fail dalam Node Apr 24, 2023 pm 05:49 PM

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Dec 13, 2022 pm 08:00 PM

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

See all articles