Rumah  >  Artikel  >  hujung hadapan web  >  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

WBOY
WBOYasal
2016-05-16 16:39:341323semak imbas

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