‫Instruktur: Selamat datang kembali.
‫Sekarang mari kita pelajari semua tentang loop acara,
‫yang merupakan inti dari Node.js. arsitektur js.
‫Dan ini mungkin adalah ceramah
‫terpenting di bagian ini, jadi pastikan Anda benar-benar
‫memahami semua yang saya tunjukkan selama video ini.
‫Jadi, mari kita mulai.
‫Jadi, berikut adalah diagram yang mirip dengan kuliah terakhir
‫sehingga kita tahu persis apa yang kita bicarakan di sini.
‫Jadi, kita masih dalam proses Node di utas
‫tunggal tempat loop acara berjalan, oke?
‫Sekarang, hal pertama yang perlu
‫Anda ketahui adalah bahwa loop acara adalah
‫tempat semua kode
‫aplikasi yang ada di dalam fungsi panggilan balik dijalankan.
‫Jadi, pada dasarnya, semua kode yang bukan kode tingkat atas akan
‫berjalan di loop acara.
‫Beberapa bagian mungkin diturunkan ke kumpulan utas seperti
‫yang kita lihat di
‫kuliah terakhir, tetapi loop acara yang menangani semua ini.
‫Seperti yang saya katakan sebelumnya, itu benar-benar
‫jantung dari arsitektur Node.
‫Oke, sekarang, seperti yang saya sebutkan berkali-kali di bagian
‫pertama kursus, Node.js. js semuanya dibangun
‫di sekitar fungsi panggilan balik.
‫Jadi, fungsi yang dipanggil segera
‫setelah beberapa pekerjaan selesai beberapa waktu di masa depan.
‫Ingat itu?
‫Dan ini bekerja dengan cara ini
‫karena Node menggunakan arsitektur yang dipicu oleh
‫peristiwa, yang akan kita bicarakan di salah
‫satu video berikutnya.
‫Tetapi yang perlu Anda ketahui
‫untuk saat ini adalah bahwa
‫hal-hal seperti aplikasi kami menerima permintaan HTTP di server kami atau penghitung waktu kedaluwarsa
‫atau file yang selesai untuk dibaca, semua ini akan memancarkan
‫peristiwa segera setelah selesai dengan pekerjaan mereka,
‫dan acara kami loop kemudian akan mengambil acara
‫ini dan memanggil
‫fungsi panggilan balik yang terkait dengan setiap acara.
‫Oke, masuk akal?
‫Jadi, sekali lagi, loop peristiwa menerima peristiwa setiap kali
‫sesuatu yang penting terjadi, dan kemudian
‫akan memanggil panggilan balik yang diperlukan seperti yang
‫kita definisikan dalam kode kita.
‫Jadi, secara ringkas, biasanya dikatakan
‫bahwa loop peristiwa melakukan orkestrasi, yang
‫berarti bahwa ia menerima peristiwa, memanggil
‫fungsi panggilan baliknya,
‫dan memindahkan tugas yang lebih mahal ke kumpulan utas.
‫Sekarang, bagaimana semua ini benar-benar bekerja di belakang layar?
‫Dalam urutan apa panggilan balik ini dieksekusi?
‫Nah, itulah yang akan kita cari tahu selanjutnya.
‫Jadi, ingat, ketika kita memulai aplikasi Node
‫kita, loop acara mulai berjalan segera.
‫Sekarang, loop peristiwa memiliki beberapa fase,
‫dan setiap fase memiliki antrian panggilan balik,
‫yang merupakan panggilan balik yang berasal dari peristiwa
‫yang diterima oleh
‫loop peristiwa, seperti yang kita bicarakan di slide terakhir.
‫Sekarang, di beberapa tempat Anda
‫akan membaca bahwa hanya ada satu antrian panggilan balik atau satu antrian
‫peristiwa, tetapi sebenarnya, seperti yang saya katakan, loop peristiwa memiliki banyak fase
‫di mana setiap fase memiliki antrian panggilan baliknya sendiri.
‫Jadi, sekarang mari kita lihat empat fase yang paling penting.
‫Ada satu atau dua fase lain
‫yang digunakan secara internal oleh
‫Node, tetapi ini tidak
‫terlalu penting dan saya tidak akan membicarakannya.
‫Jadi, fase
‫pertama menangani callback dari timer
‫yang kedaluwarsa, misalnya, dari fungsi setTimeout().
‫Jadi, jika ada fungsi callback dari timer
‫yang baru saja kedaluwarsa, ini adalah yang
‫pertama diproses oleh loop acara.
‫Jika penghitung waktu kedaluwarsa nanti selama salah
‫satu fase lain sedang diproses,
‫maka panggilan balik pengatur waktu itu hanya akan dipanggil
‫segera setelah loop acara kembali ke fase pertama ini.
‫Masuk akal?
‫Dan itu bekerja seperti ini di keempat fase.
‫Jadi, panggilan balik di setiap antrian
‫diproses satu per satu sampai tidak ada yang tersisa di
‫antrian, dan baru setelah itu, loop acara akan memasuki fase berikutnya.
‫Selanjutnya, kita memiliki polling I/O dan eksekusi callback I/O.
‫Dan sekali lagi, ingat bahwa I/O adalah singkatan dari input/output.
‫Jadi, polling pada dasarnya berarti mencari event I/O
‫baru yang siap untuk
‫diproses dan memasukkannya ke dalam antrian callback.
‫Dan ingat bahwa dalam konteks aplikasi Node,
‫I/O berarti terutama hal-hal seperti jaringan dan akses file, jadi, ini
‫adalah fase di mana mungkin 99% dari kode
‫kita akan dieksekusi,
‫hanya karena dalam aplikasi Node
‫biasa, sebagian besar yang perlu kita lakukan adalah terkait
‫dengan jaringan dan juga, pengaksesan file.
‫Fase berikutnya adalah untuk callback setImmediate, dan setImmediate
‫adalah jenis timer khusus yang dapat
‫kita gunakan jika kita ingin memproses callback segera setelah
‫fase polling dan eksekusi I/O, yang mungkin penting
‫dalam beberapa kasus penggunaan yang lebih lanjut.
‫Baiklah.
‫Dan akhirnya, fase keempat adalah untuk panggilan balik yang dekat, yang,
‫sekali lagi, tidak begitu penting bagi kami,
‫tetapi saya tetap menempatkan ini di sini demi kelengkapan.
‫Pada dasarnya, pada fase ini, semua close
‫event diproses, misalnya saat server web atau WebSocket dimatikan.
‫Jadi, ini adalah empat fase dalam loop
‫acara, tetapi selain empat antrian panggilan balik yang baru
‫saja kita lihat, sebenarnya ada juga
‫dua antrian lainnya, antrian nextTick() dan antrian microtasks
‫lainnya, yang terutama untuk janji yang diselesaikan.
‫Jika Anda tidak terbiasa dengan
‫janji, kami akan membicarakannya sedikit di bagian selanjutnya.
‫Bagaimanapun, jika ada panggilan balik di
‫salah satu dari dua antrian
‫ini untuk diproses, mereka akan dieksekusi tepat setelah
‫fase saat ini dari loop peristiwa selesai
‫alih-alih menunggu seluruh loop selesai.
‫Oke?
‫Jadi, dengan kata lain, setelah masing-masing dari empat
‫fase ini, jika ada panggilan balik di dua antrian
‫khusus ini, mereka akan segera dieksekusi.
‫Sekarang, misalnya, bayangkan bahwa janji menyelesaikan dan
‫mengembalikan beberapa data dari panggilan API saat panggilan balik
‫dari timer yang kedaluwarsa sedang berjalan.
‫Jadi, dalam hal ini, panggilan balik janji akan dieksekusi
‫tepat setelah panggilan dari penghitung waktu selesai.
‫Oke?
‫Dan logika yang sama juga berlaku untuk antrian nextTick(),
‫yang belum kita bicarakan.
‫Jadi, pada dasarnya, proses nextTick() adalah fungsi yang dapat
‫kita gunakan saat kita benar-benar perlu
‫menjalankan panggilan balik tertentu tepat
‫setelah fase loop peristiwa saat ini.
‫Ini sedikit mirip dengan setImmediate, dengan
‫perbedaan bahwa setImmediate hanya berjalan setelah fase
‫panggilan balik I/O.
‫Namun, yang
‫serupa adalah keduanya untuk kasus penggunaan yang benar-benar canggih,
‫dan kita mungkin bahkan tidak akan
‫membutuhkannya selama kursus ini.
‫Tapi bagaimanapun, saya ingin memasukkan hal-hal yang lebih kompleks ini
‫di sini juga sehingga Anda memiliki alat
‫yang Anda butuhkan jika Anda benar-benar perlu
‫menggali jauh ke dalam Node.js. js jika Anda mau.
‫Baiklah, dan dengan itu, kami benar-benar menyelesaikan satu
‫centang dari loop acara, dan satu centang pada dasarnya hanya satu siklus
‫dalam loop ini.
‫Jadi, sekarang saatnya untuk memutuskan apakah perulangan
‫harus berlanjut ke centang berikutnya atau program harus keluar.
‫Dan bagaimana Node melakukan itu?
‫Yah, itu sangat sederhana.
‫Node hanya memeriksa apakah ada timer
‫atau tugas I/O yang masih berjalan di latar belakang,
‫dan jika tidak ada, maka ia akan keluar dari aplikasi.
‫Tetapi jika ada timer yang tertunda atau tugas I/O,
‫maka itu akan terus menjalankan
‫loop acara dan langsung menuju centang berikutnya.
‫Jadi, misalnya, ketika kami
‫mendengarkan permintaan HTTP masuk seperti yang kami lakukan
‫di proyek pertanian Node kami di bagian sebelumnya, kami
‫pada dasarnya menjalankan tugas I/O, dan itulah sebabnya
‫loop acara, dan oleh karena
‫itu, Node.js. js, terus
‫berjalan dan terus dengarkan permintaan HTTP baru yang
‫masuk alih-alih hanya keluar dari aplikasi.
‫Juga, saat kita menulis atau membaca
‫file di latar belakang, itu juga merupakan tugas
‫I/O, jadi masuk akal jika aplikasi tidak
‫keluar saat sedang bekerja dengan file itu, bukan?
‫Oke, dan ini pada dasarnya apa yang harus Anda
‫ketahui tentang Node.js. loop acara js.
‫Jika Anda membutuhkan lebih banyak detail
‫dari ini, Anda
‫selalu dapat mencoba membaca dokumentasi Node resmi, yang
‫seharusnya cukup mudah untuk Anda pahami
‫saat ini karena Anda sudah memahami sebagian besar loop acara.
‫Dan saya hanya ingin menekankan bahwa
‫sangat, sangat penting bagi Anda untuk memahami loop acara
‫dengan benar sehingga Anda dapat menulis kode
‫kinerja Anda sendiri dan juga men-debug kode Anda sendiri
‫ketika terjadi kesalahan dengan cara yang tidak terduga.
‫Dan sekarang, sebagai penutup, mari kita tinjau beberapa
‫hal yang telah kita bicarakan di sini.
‫Jadi, singkatnya, hal terpenting yang saya ingin Anda
‫pahami dari kuliah ini, dan mungkin
‫dari keseluruhan kursus ini, adalah bahwa
‫loop peristiwa adalah yang memungkinkan
‫pemrograman asinkron di Node.js. js, menjadikannya
‫fitur terpenting dalam desain dan pembuatan
‫Node.js. js benar-benar
‫berbeda dari platform lain.
‫Itu menangani semua acara yang masuk
‫dan melakukan orkestrasi dengan menurunkan tugas yang lebih berat
‫ke kumpulan utas, dan melakukan pekerjaan paling sederhana itu sendiri.
‫Juga, ingat bahwa kita membutuhkan loop
‫acara karena di Node.js. js semuanya bekerja dalam satu
‫utas, jadi, Anda dapat memiliki ribuan
‫atau jutaan pengguna yang mengakses utas yang sama pada saat yang bersamaan.
‫Ini membuat Node sangat ringan dan skalabel,
‫tetapi pada saat yang sama, ia datang
‫dengan bahaya memblokir
‫utas tunggal kami, yang akan membuat
‫seluruh aplikasi lambat atau bahkan berhenti untuk semua pengguna Anda yang mengakses aplikasi, bukan?
‫Sekarang, dalam bahasa lain seperti PHP
‫yang berjalan di server Apache, pada dasarnya, utas baru
‫dibuat untuk setiap pengguna baru, yang jauh lebih intensif sumber daya.
‫Tapi di sisi lain, tidak
‫ada bahaya memblokir, kan?
‫Jadi, keseluruhan model itu membuatnya sedikit lebih
‫mudah untuk menggunakan PHP untuk pemula, tetapi tentu saja,
‫ia datang dengan kekurangannya sendiri,
‫yang tidak akan saya bahas saat ini.
‫Bagaimanapun, izinkan saya kembali
‫mengingatkan Anda bahwa itu adalah tanggung jawab Anda untuk tidak memblokir
‫loop acara, jadi inilah beberapa panduan untuk itu.
‫Pertama, jangan gunakan versi
‫sinkronisasi fungsi di modul fs, crypto,
‫atau zlib di fungsi panggilan balik Anda, oke?
‫Jadi, dalam proyek pertama kami, kami benar-benar
‫menggunakan versi sinkron, tetapi itu dalam kode tingkat atas, jadi
‫di luar panggilan balik apa pun.
‫Dan karena kode itu berjalan bahkan sebelum loop acara
‫dimulai, yah, tidak masalah untuk menggunakan versi sinkron di sana.
‫Juga, dan ini mungkin cukup jelas,
‫jangan melakukan perhitungan yang sangat rumit di loop acara.
‫Jadi, hal-hal seperti menghitung
‫jutaan angka dalam loop di dalam loop, atau sesuatu seperti itu.
‫Selanjutnya, berhati-hatilah dengan JSON pada objek yang sangat besar
‫karena pada titik tertentu, mungkin perlu
‫waktu lama untuk mengurai, atau merangkai, JSON.
‫Dan terakhir, jangan gunakan semua ekspresi reguler yang terlalu rumit,
‫misalnya, dengan beberapa quantifier bersarang atau referensi
‫balik, karena sekali lagi, itu
‫bisa memakan waktu lebih lama dari yang diharapkan.
‫Ini, tentu saja, hanya beberapa pedoman
‫tingkat tinggi, tetapi mereka akan membantu Anda memulai di jalan
‫yang benar.
‫Sekarang, ada beberapa solusi
‫potensial untuk masalah pemblokiran ini, seperti menurunkan muatan
‫secara manual ke kumpulan utas atau menggunakan proses turunan, dan
‫kita mungkin membicarakannya di akhir kursus atau
‫beberapa waktu di masa mendatang, tetapi
‫untuk saat ini, penting bahwa Anda memahami dan mengikuti
‫saran ini untuk benar-benar tidak memblokir loop acara.
‫Baiklah.
‫Selanjutnya, saya akan memberikan contoh kecil untuk menunjukkan
‫beberapa hal yang
‫kita bicarakan dalam latihan.