Kami telah membincangkan mengapa Node JS adalah satu-benang dan juga berbilang benang dalam artikel kami yang dipanggil "Node Dalaman". Ia akan memberi anda asas yang kukuh pada seni bina Node dan menetapkan peringkat untuk memahami keajaiban Gelung Acara!
Nod js boleh dianggap sebagai satu-benang kerana Gelung Peristiwa. Tetapi, apakah gelung acara?
Saya sentiasa bermula dengan analogi restoran kerana saya fikir ia menjadi mudah untuk memahami butiran teknikal.
Jadi, Chef utama di restoran mengambil pesanan daripada senarai pesanan dan memberikannya kepada pasukan pembantu. Apabila makanan sudah siap, chef menghidangkan makanan. Jika ada pelanggan VIP datang maka chef utamakan tempahan ini.
Jika kita mengambil analogi ini sebagai pertimbangan kita maka kita boleh mengatakan bahawa...
Dalam konteks Gelung Acara Node JS.
Chef ialah Gelung Acara yang mengurus tugas dan mengagihkan kerja.
Pasukan Bantuan ialah rangkaian pekerja atau OS yang mengendalikan pelaksanaan tugas yang diwakilkan kepada mereka.
Senarai Pesanan ialah baris gilir tugasan untuk tugasan yang menunggu giliran.
Pelanggan VIP ialah Microtask yang mempunyai keutamaan tinggi dan diselesaikan sebelum tugas biasa.
Untuk, Memahami Gelung Peristiwa, kita perlu terlebih dahulu memahami perbezaan antara Tugasan Mikro dan Tugasan Makro.
Tugasan mikro
Microtask bermaksud tugasan yang mempunyai keutamaan tinggi dan dilaksanakan selepas kod Javascript yang sedang dilaksanakan selesai, tetapi sebelum beralih ke fasa seterusnya Gelung Acara.
Contoh:
- proses.Tick seterusnya
- Janji (.kemudian, .tangkap, .akhirnya)
- gilirMicrotask
Tugasan makro
Ini adalah tugas-tugas keutamaan yang lebih rendah yang beratur untuk pelaksanaan pada fasa kemudian dalam Gelung Acara.
Contoh:
- setTimeout
- setInterval
- setImmediate
- Operasi I/O
Gelung Peristiwa
Apabila kami menjalankan tugas tak segerak dalam Node.js, Gelung Peristiwa adalah teras kepada segala-galanya.
Terima kasih kepada Event Loop, Node.js boleh melaksanakan operasi I/O tanpa sekatan dengan cekap. Ia mencapai ini dengan menyerahkan tugas yang memakan masa kepada sistem pengendalian atau rangkaian pekerja. Setelah tugasan selesai, panggilan balik mereka diproses secara teratur, memastikan pelaksanaan lancar tanpa menyekat urutan utama.
Inilah keajaiban yang membolehkan Node.js mengendalikan berbilang tugas secara serentak sementara masih berbenang tunggal.
Fasa-fasa
Terdapat enam fasa dalam Gelung Acara dan setiap fasa mempunyai baris gilir sendiri, yang memegang jenis tugasan tertentu.
1.Fasa Pemasa
Dalam fasa ini panggilan balik berkaitan pemasa dikendalikan seperti setTimeout dan setInterval.
Node js menyemak baris gilir pemasa untuk panggilan balik yang kelewatannya telah tamat tempoh.
Jika kelewatan pemasa dicapai, panggilan baliknya ditambahkan pada baris gilir ini untuk pelaksanaan.
console.log('Start'); setTimeout(() => { console.log('Timer 1 executed after 1 second'); }, 1000); setTimeout(() => { console.log('Timer 2 executed after 0.5 seconds'); }, 500); let count = 0; const intervalId = setInterval(() => { console.log('Interval callback executed'); count++; if (count === 3) { clearInterval(intervalId); console.log('Interval cleared'); } }, 1000); console.log('End');
Output:
Start End Timer 2 executed after 0.5 seconds Timer 1 executed after 1 second Interval callback executed Interval callback executed Interval callback executed Interval cleared
Fasa panggil balik 2.I/O
Tujuan fasa ini adalah untuk melaksanakan panggilan balik untuk operasi I/O (Input/Output) yang lengkap, seperti membaca atau menulis fail, menanya pangkalan data, mengendalikan permintaan rangkaian dan tugas I/O tak segerak yang lain.
Apabila anda datang sebarang operasi I/O tak segerak dalam Node.js (seperti membaca fail menggunakan fs.readFile), operasi itu diwakilkan kepada sistem pengendalian atau rangkaian pekerja. Tugas I/O ini dilaksanakan di luar utas utama dengan cara yang tidak menyekat. Setelah tugas selesai, fungsi panggil balik dicetuskan untuk memproses keputusan.
Fasa Panggilan Balik I/O ialah tempat panggilan balik ini dibariskan untuk pelaksanaan sebaik sahaja operasi selesai.
const fs = require('fs'); console.log('Start'); fs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.log('Error reading file:', err); return; } console.log('File contents:', data); }); console.log('Middle'); setTimeout(() => { console.log('Simulated network request completed'); }, 0); console.log('End');
Output
Start Middle End Simulated network request completed File contents: (contents of the example.txt file)
3.Fasa terbiar
Dalam fasa ini, tiada kerja yang ditentukan pengguna dilakukan sebaliknya dalam gelung peristiwa fasa ini bersedia untuk fasa seterusnya. hanya pelarasan dalaman dilakukan dalam fasa ini.
4.Fasa tinjauan pendapat
Fasa Undian menyemak sama ada terdapat acara I/O yang belum selesai (seperti aktiviti rangkaian atau acara sistem fail) yang perlu diproses. Ia akan segera melaksanakan panggilan balik yang dikaitkan dengan acara ini.
Jika tiada acara I/O belum selesai, Fasa Tinjauan boleh memasuki keadaan menyekat.
Dalam keadaan menyekat ini, Node.js hanya akan menunggu acara I/O baharu tiba. Keadaan menyekat inilah yang menjadikan Node.js tidak menyekat: Ia menunggu sehingga peristiwa I/O baharu mencetuskan pelaksanaan panggil balik, memastikan urutan utama bebas untuk tugasan lain sementara itu.
Sebarang panggilan balik untuk operasi I/O yang lengkap (seperti fs.readFile, permintaan HTTP atau pertanyaan pangkalan data) dilaksanakan semasa fasa ini. Operasi I/O ini mungkin telah dimulakan dalam fasa sebelumnya (seperti Fasa Pemasa atau Fasa Panggilan Balik I/O) dan kini telah selesai.
Jika terdapat pemasa ditetapkan dengan setTimeout atau setInterval, Node.js akan menyemak sama ada mana-mana pemasa telah tamat tempoh dan jika panggilan balik yang berkaitan perlu dilaksanakan. Jika pemasa telah tamat tempoh, panggilan balik mereka dialihkan ke baris gilir panggil balik, tetapi ia tidak akan diproses sehingga fasa seterusnya, iaitu Fasa Pemasa.
const fs = require('fs'); const https = require('https'); console.log('Start'); fs.readFile('file1.txt', 'utf8', (err, data) => { if (err) { console.log('Error reading file1:', err); return; } console.log('File1 content:', data); }); fs.readFile('file2.txt', 'utf8', (err, data) => { if (err) { console.log('Error reading file2:', err); return; } console.log('File2 content:', data); }); https.get('https://jsonplaceholder.typicode.com/todos/1', (response) => { let data = ''; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { console.log('HTTP Response:', data); }); }); console.log('End');
Output:
Start End File1 content: (contents of file1.txt) File2 content: (contents of file2.txt) HTTP Response: (JSON data from the HTTP request)
5.Semak fasa
Selepas Fasa Undian telah menyelesaikan tugasnya. Fasa ini terutamanya mengendalikan pelaksanaan panggilan balik setImmediate, yang dijadualkan untuk dijalankan serta-merta selepas acara I/O diproses dalam Fasa Tinjauan.
setPanggil balik segera sering digunakan apabila anda ingin melakukan tindakan selepas kitaran gelung peristiwa semasa, seperti memastikan beberapa tugasan dilaksanakan selepas sistem tidak sibuk memproses acara I/O.
Fasa Semak mempunyai keutamaan yang lebih tinggi berbanding Fasa Pemasa (yang mengendalikan setTimeout dan setInterval). Ini bermakna setPanggil balik segera akan sentiasa dilaksanakan sebelum mana-mana pemasa walaupun pemasanya telah tamat tempoh.
setImmediate menjamin bahawa panggilan baliknya akan dijalankan selepas kitaran I/O semasa dan sebelum kitaran pemasa seterusnya. Ini boleh menjadi penting apabila anda ingin memastikan bahawa tugasan berkaitan I/O diselesaikan terlebih dahulu sebelum menjalankan tugas lain.
console.log('Start'); setTimeout(() => { console.log('Timer 1 executed after 1 second'); }, 1000); setTimeout(() => { console.log('Timer 2 executed after 0.5 seconds'); }, 500); let count = 0; const intervalId = setInterval(() => { console.log('Interval callback executed'); count++; if (count === 3) { clearInterval(intervalId); console.log('Interval cleared'); } }, 1000); console.log('End');
Output:
Start End Timer 2 executed after 0.5 seconds Timer 1 executed after 1 second Interval callback executed Interval callback executed Interval callback executed Interval cleared
6.fasa tutup
Fasa Tutup Panggilan Balik biasanya dilaksanakan apabila aplikasi perlu dibersihkan sebelum keluar atau ditutup.
Fasa ini berurusan dengan acara dan tugasan yang perlu dilaksanakan sebaik sahaja sumber sistem, seperti soket rangkaian atau pemegang fail, tidak diperlukan lagi.
Tanpa fasa ini, aplikasi mungkin membiarkan pemegang fail terbuka, sambungan rangkaian atau sumber lain, yang berpotensi membawa kepada kebocoran memori, kerosakan data atau isu lain.
const fs = require('fs'); console.log('Start'); fs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.log('Error reading file:', err); return; } console.log('File contents:', data); }); console.log('Middle'); setTimeout(() => { console.log('Simulated network request completed'); }, 0); console.log('End');
Output:
Start Middle End Simulated network request completed File contents: (contents of the example.txt file)
Terdapat satu lagi fasa istimewa dalam Gelung Peristiwa Node JS.
Baris Gilir Tugasan Mikro
process.nextTick() dan berjanji untuk melaksanakan panggilan balik mereka dalam fasa khas dalam Gelung Acara.
process.nextTick() menjadualkan panggilan balik untuk dilaksanakan serta-merta selepas operasi semasa selesai, tetapi sebelum gelung acara diteruskan ke fasa seterusnya.
process.nextTick() bukan sebahagian daripada mana-mana fasa dalam gelung acara. Sebaliknya, ia mempunyai baris gilir dalaman sendiri yang dapat dilaksanakan sejurus selepas kod segerak yang sedang dilaksanakan dan sebelum sebarang fasa dalam gelung acara dimasukkan.
Ia dilaksanakan selepas operasi semasa tetapi sebelum I/O, setTimeout atau tugas lain yang dijadualkan dalam gelung acara.
Janji mempunyai keutamaan yang lebih rendah daripada process.nextTick() dan diproses selepas semua panggil balik process.nextTick().
const fs = require('fs'); const https = require('https'); console.log('Start'); fs.readFile('file1.txt', 'utf8', (err, data) => { if (err) { console.log('Error reading file1:', err); return; } console.log('File1 content:', data); }); fs.readFile('file2.txt', 'utf8', (err, data) => { if (err) { console.log('Error reading file2:', err); return; } console.log('File2 content:', data); }); https.get('https://jsonplaceholder.typicode.com/todos/1', (response) => { let data = ''; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { console.log('HTTP Response:', data); }); }); console.log('End');
Output:
Start End File1 content: (contents of file1.txt) File2 content: (contents of file2.txt) HTTP Response: (JSON data from the HTTP request)
Kini, Anda mempunyai idea keseluruhan tentang cara Gelung Acara berfungsi.
Saya memberi anda satu soalan yang mana jawapan anda boleh berikan dalam ulasan.
const fs = require('fs'); console.log('Start'); fs.readFile('somefile.txt', 'utf8', (err, data) => { if (err) { console.error(err); return; } console.log('File content:', data); }); setImmediate(() => { console.log('Immediate callback executed'); }); setTimeout(() => { console.log('Timeout callback executed'); }, 0); console.log('End');
Terima kasih.
Menunggu jawapan anda.
Atas ialah kandungan terperinci Node JS - Gelung Acara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Terdapat tiga cara biasa untuk memulakan permintaan HTTP dalam node.js: Gunakan modul terbina dalam, axios, dan nod-fetch. 1. Gunakan modul HTTP/HTTPS terbina dalam tanpa kebergantungan, yang sesuai untuk senario asas, tetapi memerlukan pemprosesan manual jahitan data dan pemantauan ralat, seperti menggunakan https.get () untuk mendapatkan data atau menghantar permintaan pos melalui .write (); 2.AXIOS adalah perpustakaan pihak ketiga berdasarkan janji. Ia mempunyai sintaks ringkas dan fungsi yang kuat, menyokong async/menunggu, penukaran JSON automatik, pemintas, dan lain -lain. Adalah disyorkan untuk memudahkan operasi permintaan tak segerak; 3.Node-Fetch menyediakan gaya yang serupa dengan pengambilan penyemak imbas, berdasarkan janji dan sintaks mudah

Jenis data JavaScript dibahagikan kepada jenis primitif dan jenis rujukan. Jenis primitif termasuk rentetan, nombor, boolean, null, undefined, dan simbol. Nilai -nilai tidak berubah dan salinan disalin apabila memberikan nilai, jadi mereka tidak mempengaruhi satu sama lain; Jenis rujukan seperti objek, tatasusunan dan fungsi menyimpan alamat memori, dan pembolehubah menunjuk objek yang sama akan mempengaruhi satu sama lain. Typeof dan Instanceof boleh digunakan untuk menentukan jenis, tetapi memberi perhatian kepada isu -isu sejarah TypeOfNull. Memahami kedua -dua jenis perbezaan ini dapat membantu menulis kod yang lebih stabil dan boleh dipercayai.

Helo, pemaju JavaScript! Selamat datang ke berita JavaScript minggu ini! Minggu ini kami akan memberi tumpuan kepada: Pertikaian tanda dagangan Oracle dengan Deno, objek masa JavaScript baru disokong oleh pelayar, kemas kini Google Chrome, dan beberapa alat pemaju yang kuat. Mari mulakan! Pertikaian tanda dagangan Oracle dengan percubaan Deno Oracle untuk mendaftarkan tanda dagangan "JavaScript" telah menyebabkan kontroversi. Ryan Dahl, pencipta Node.js dan Deno, telah memfailkan petisyen untuk membatalkan tanda dagangan, dan dia percaya bahawa JavaScript adalah standard terbuka dan tidak boleh digunakan oleh Oracle

Janji adalah mekanisme teras untuk mengendalikan operasi tak segerak dalam JavaScript. Memahami panggilan rantaian, pengendalian ralat dan gabungan adalah kunci untuk menguasai aplikasi mereka. 1. Panggilan rantai mengembalikan janji baru melalui .then () untuk merealisasikan persamaan proses tak segerak. Setiap .then () menerima hasil sebelumnya dan boleh mengembalikan nilai atau janji; 2. Pengendalian ralat harus menggunakan .catch () untuk menangkap pengecualian untuk mengelakkan kegagalan senyap, dan boleh mengembalikan nilai lalai dalam tangkapan untuk meneruskan proses; 3. Gabungan seperti janji.all () (berjaya hanya berjaya selepas semua kejayaan), janji.race () (penyempurnaan pertama dikembalikan) dan janji.allsettled () (menunggu semua penyelesaian)

CACHEAPI adalah alat yang disediakan oleh penyemak imbas kepada permintaan rangkaian cache, yang sering digunakan bersempena dengan ServiceWorker untuk meningkatkan prestasi laman web dan pengalaman luar talian. 1. Ia membolehkan pemaju menyimpan sumber secara manual seperti skrip, helaian gaya, gambar, dan lain -lain; 2. Ia boleh memadankan tindak balas cache mengikut permintaan; 3. Ia menyokong memotong cache tertentu atau membersihkan seluruh cache; 4. Ia boleh melaksanakan keutamaan cache atau strategi keutamaan rangkaian melalui perkhidmatan pekerja yang mendengar acara mengambil; 5. Ia sering digunakan untuk sokongan luar talian, mempercepat kelajuan akses berulang, sumber utama dan kandungan kemas kini latar belakang; 6. Apabila menggunakannya, anda perlu memberi perhatian kepada kawalan versi cache, sekatan penyimpanan dan perbezaan dari mekanisme caching HTTP.

Gelung acara JavaScript menguruskan operasi tak segerak dengan menyelaraskan susunan panggilan, webapis, dan barisan tugas. 1. Stack panggilan melaksanakan kod segerak, dan ketika menghadapi tugas -tugas yang tidak segerak, ia diserahkan kepada Webapi untuk diproses; 2. Selepas Webapi melengkapkan tugas di latar belakang, ia meletakkan panggil balik ke dalam barisan yang sama (tugas makro atau tugas mikro); 3. Loop acara memeriksa sama ada timbunan panggilan kosong. Jika ia kosong, panggilan balik diambil dari barisan dan ditolak ke dalam tumpukan panggilan untuk pelaksanaan; 4. Tugas -tugas mikro (seperti janji. 5. Memahami gelung acara membantu mengelakkan menyekat benang utama dan mengoptimumkan pesanan pelaksanaan kod.

Gelembung peristiwa menyebarkan dari elemen sasaran ke luar ke nod nenek moyang, sementara penangkapan peristiwa menyebarkan dari lapisan luar ke dalam ke elemen sasaran. 1. Bubbles Acara: Selepas mengklik elemen kanak -kanak, acara itu mencetuskan pendengar elemen induk ke atas. Sebagai contoh, selepas mengklik butang, ia mengeluarkan anak -anak terlebih dahulu, dan kemudian ParentClicked. 2. Tangkap Acara: Tetapkan parameter ketiga menjadi benar, supaya pendengar dilaksanakan di peringkat penangkapan, seperti mencetuskan pendengar penangkapan elemen induk sebelum mengklik butang. 3. Penggunaan praktikal termasuk pengurusan bersatu peristiwa elemen kanak -kanak, pemprosesan pemintasan dan pengoptimuman prestasi. 4. Aliran acara DOM dibahagikan kepada tiga peringkat: menangkap, sasaran dan gelembung, dan pendengar lalai dilaksanakan di peringkat gelembung.

Dalam tatasusunan JavaScript, sebagai tambahan kepada peta dan penapis, terdapat kaedah lain yang kuat dan jarang digunakan. 1. Mengurangkan bukan sahaja dapat jumlah, tetapi juga mengira, kumpulan, array meratakan, dan membina struktur baru; 2. Cari dan FindIndex digunakan untuk mencari elemen atau indeks individu; 3. Beberapa dan segala -galanya digunakan untuk menentukan sama ada keadaan wujud atau semua memenuhi; 4.Sort boleh disusun tetapi akan mengubah array asal; 5. Beri perhatian untuk menyalin array apabila menggunakannya untuk mengelakkan kesan sampingan. Kaedah ini menjadikan kod lebih ringkas dan cekap.
