‫Jonas: Sekarang mari kita
‫menulis beberapa kode untuk mendapatkan pemahaman yang lebih
‫baik tentang apa yang terjadi di loop acara.
‫Jadi seperti sebelumnya, untuk
‫memulai bagian pengkodean bagian ini,
‫lanjutkan dan ambil file starter
‫untuk bagian ini, salin di suatu
‫tempat, lalu buka proyek di editor kode Anda.
‫Jadi saya memilikinya di sini di desktop, dan
‫di VSCode saya, dan semua yang kita miliki di sini untuk
‫memulai adalah file uji ini. txt, jadi saya akan membuat file baru di
‫sini, dan saya akan menyebutnya event-loop. js.
‫Baiklah, sekarang sebenarnya sangat sulit untuk mensimulasikan loop acara dengan
‫benar, karena kita tidak dapat benar-benar menempatkan
‫banyak panggilan balik di semua antrian
‫panggilan balik yang
‫telah kita bicarakan sebelumnya pada saat yang sama, kan.
‫Situasi itu terjadi ketika misalnya
‫banyak permintaan masuk ke aplikasi Anda,
‫tetapi di sini secara lokal, itu sangat sulit untuk ditiru.
‫Tapi bagaimanapun, kami masih akan melakukan beberapa eksperimen
‫yang sangat menarik menggunakan beberapa hal yang
‫kami pelajari di video terakhir.
‫Dan yang akan kita
‫lakukan adalah menulis sekumpulan baris kode,
‫dan kemudian mencoba mencari tahu urutan eksekusinya
‫dalam loop peristiwa, dan menganalisis apakah hasil
‫yang kita peroleh benar-benar masuk akal.
‫Jadi mari kita mulai dengan menulis setTimeout,
‫jadi pada dasarnya untuk menyetel timer,
‫dan saya menggunakan fungsi panah
‫di sini, dan
‫satu-satunya hal yang akan saya lakukan adalah
‫masuk ke konsol beberapa string, jadi konsol. log, timer satu selesai,
‫dan saya ingin ini kedaluwarsa setelah nol detik.
‫Oke, simpan, dan kemudian Anda melihat bahwa
‫itu benar-benar mengoreksi string ini di sini,
‫jadi itu mengubah tanda kutip ini, dan menambahkan titik
‫koma, dan itu karena
‫ekstensi Prettier yang kami instal sebelumnya.
‫Sekarang saya tidak akan mengonfigurasinya
‫di sini, karena untuk
‫contoh kecil ini, itu tidak terlalu diperlukan, oke.
‫Jadi itu adalah mengatur timer, maka mari
‫kita juga menggunakan setImmediate, jadi ingat itu dari video terakhir.
‫Oke, sekarang saya tidak akan menjelaskan banyak di sini,
‫untuk sekarang mari kita tulis
‫kode ini, lalu analisis apa yang terjadi, oke.
‫Jadi setImmediate, dan seperti timer lainnya, ia menerima
‫fungsi panggilan balik.
‫Dan yang akan kita lakukan hanyalah
‫menulis yang segera selesai, dan yang ini tidak
‫punya waktu, karena
‫itu tidak perlu karena seperti namanya, itu segera.
‫Kemudian hal lain yang ingin
‫kita lakukan adalah membaca file ini di sini, dan
‫kemudian melewatkan fungsi panggilan balik, oke, jadi hal pertama yang
‫harus kita lakukan adalah membutuhkan modul yang benar, jadi FS, dan sekarang
‫fs. readFile, dan kami ingin file teks. txt,
‫dan kemudian sesuatu terjadi.
‫Dan seperti sebelumnya, katakan saja
‫di sini, dalam hal ini I/O selesai, baiklah.
‫Jadi I/O karena panggilan
‫balik ini sebenarnya terkait dengan tugas I/O, yang
‫sebenarnya mendapatkan fasenya sendiri di loop acara, kan.
‫Dan akhirnya, mari kita tambahkan konsol. log di sini,
‫mengatakan baik, halo dari kode tingkat atas.
‫Oke, dan jadi kode tingkat atas, karena itu sebenarnya satu-satunya
‫yang tidak ada di dalam panggilan balik apa pun.
‫Jadi dalam contoh kecil yang kita miliki untuk saat ini, mari kita
‫coba mencari tahu apa yang harus terjadi terlebih dahulu.
‫Ingat, langkah pertama saat
‫kita memuat modul adalah kode tingkat
‫atas dieksekusi, jadi kita akan segera
‫melihat konsol ini. log di sini, benar,
‫baru kemudian kita akan melihat log lain yang
‫berasal dari callback lain ini, karena
‫callback ini akan benar-benar berjalan di loop acara.
‫Jadi mari kita coba untuk melihat apakah
‫itu benar-benar masalahnya, dan kemudian menganalisisnya sedikit lebih baik.
‫Jadi membuka konsol di sini, dan lagi,
‫saya melakukannya dengan menggunakan
‫terminal, atau sebenarnya di tampilan, jadi terminal ini di sini, oke.
‫Jadi perhatikan, acara-loop. js, atau sebenarnya sebelum
‫kita melakukannya, saya perlu memperbaiki kesalahan ketik ini di sini, jadi
‫ini adalah file uji, bukan file teks.
‫Oke, tapi sekarang kita siap untuk
‫menjalankan perintah ini, dan hasilnya masuk, jadi log pertama
‫yang kita miliki di sini adalah halo dari kode
‫tingkat atas, dan itu diharapkan,
‫kan, karena ini adalah kode yang dieksekusi langsung.
‫Kemudian setelah itu, kita memiliki tiga keluaran ini, tetapi sebenarnya
‫tidak dalam urutan tertentu, dan itu
‫karena kode ini di sini,
‫jadi kode ini, sebenarnya tidak dalam siklus I/O, jadi
‫tidak berjalan di dalam loop peristiwa, karena itu
‫tidak berjalan di dalam fungsi panggilan balik apa pun.
‫Oke, jadi di komputer Anda, Anda mungkin benar-benar melihat log
‫ini di sini sebelum
‫yang ini, lalu yang ini di
‫sini hanya yang terakhir karena jenis file besar di
‫sini membutuhkan waktu untuk dibaca, jadi mungkin
‫akan selalu menjadi yang terakhir satu.
‫Jadi sekali lagi, pada titik ini, urutan ketiganya di sini tidak
‫ada hubungannya dengan loop acara, karena
‫mereka sebenarnya belum berjalan
‫di dalam loop acara dulu.
‫Untuk itu, kita harus memindahkannya, atau
‫setidaknya memindahkan keduanya ke sini, di dalam fungsi panggilan balik.
‫Jadi, untuk itu kita akan menggunakan yang ini di sini sebenarnya.
‫Jadi biarkan saya meletakkannya di sini, dan katakan timer dua dan timer dua
‫di sini, atau langsung dua, dan saya juga akan menambahkan timer lain di sini,
‫jadi timer tiga, dan yang ini
‫akan berjalan selama tiga detik, jadi 3000 milidetik .
‫Jadi sekarang mari kita coba hasil yang satu ini.
‫Tapi sebelum kita melakukan itu,
‫mari kita pikirkan mengapa setelah semua kode sebelumnya
‫dijalankan, program kemudian keluar dan kembali ke prompt di sini.
‫Jadi ingat bagaimana Node. js memutuskan apakah
‫itu harus terus menjalankan loop acara, baik itu
‫melakukannya dengan menanyakan apakah masih ada waktu yang berjalan
‫di latar belakang, dan jika demikian, itu tidak akan selesai,
‫dan jika masih ada pengatur waktu yang
‫tertunda, maka itu tidak akan keluar dari program.
‫Tetapi jika tidak ada, seperti yang
‫terjadi pada contoh pertama di sini, maka ia akan segera keluar
‫dari program, oke, tapi sekarang kita sebenarnya memiliki satu
‫timer di sini, jadi yang ini akan berjalan
‫selama tiga detik, jadi mari kita coba mencari tahu
‫apa terjadi di sini.
‫Oke, jadi Anda lihat itu
‫tidak keluar, dan baru sekarang, setelah timer tiga
‫selesai, itu kemudian keluar dari aplikasi.
‫Oke, jadi mari kita lihat itu
‫lagi, jadi semua timer log ini berjalan, timer
‫selesai, dan keluar dari aplikasi.
‫Sekarang tentang hasil ini di sini, mari kita
‫buat ini di sini sedikit lebih
‫mudah untuk dilihat, dan tambahkan hanya pemisah kecil di sini.
‫Oke, bersihkan ini, oke.
‫Jadi keempat yang di sini adalah output yang
‫tidak benar-benar berjalan di loop acara, tetapi
‫ketiganya di sini sebenarnya keluar
‫dari loop acara, jadi sekarang mari kita menganalisis hasil ini.
‫Sekarang, jika Anda
‫ingat diagram dari kuliah sebelumnya, Anda
‫mungkin akan berpikir bahwa timer, jadi timer dua di sini,
‫harus benar-benar selesai sebelum setSegera,
‫karena dalam diagram, itu benar-benar muncul pertama
‫tepat di atas lingkaran acara.
‫Jadi kita harus menyetel batas waktu
‫di sini dengan nol, yang seharusnya sama dengan setImmediate, kan.
‫Jadi mengapa
‫setImmediate benar-benar muncul sebelum setTimeout?
‫Nah, ada sesuatu yang tidak
‫saya jelaskan di video terakhir, karena
‫saya tidak ingin membuatnya semakin membingungkan, dan itu adalah
‫bahwa loop acara sebenarnya menunggu hal-hal terjadi di fase polling.
‫Jadi dalam fase di mana panggilan balik I/O ditangani.
‫Jadi ketika antrian panggilan balik ini kosong, yang merupakan
‫kasus dalam contoh fiksi kami di sini,
‫jadi kami tidak memiliki panggilan balik
‫I/O, yang kami miliki hanyalah pengatur waktu ini, maka loop
‫acara akan menunggu di fase ini sampai ada yang kedaluwarsa pengatur waktu.
‫Namun, jika kita menjadwalkan panggilan balik menggunakan setImmediate, maka
‫panggilan balik itu akan benar-benar dieksekusi segera
‫setelah fase pemungutan suara, dan
‫bahkan sebelum penghitung waktu yang kedaluwarsa, jika ada.
‫Dan dalam hal ini, penghitung waktu segera berakhir,
‫jadi setelah nol detik, tetapi sekali lagi,
‫loop acara benar-benar menunggu, sehingga berhenti di fase pemungutan suara.
‫Dan agar panggilan balik
‫setImmediate benar-benar dieksekusi terlebih dahulu, jadi itulah alasan
‫mengapa kami memiliki ini segera setelah kami memiliki penghitung waktu.
‫Oke, dan saya tahu ini terdengar sangat membingungkan,
‫dan saya sepenuhnya setuju, tapi
‫memang begitulah Node.js. js bekerja.
‫Dan sekarang mari kita buat ini sedikit lebih membingungkan,
‫dan tambahkan prosesnya. nextTick yang
‫kita bicarakan juga di kuliah terakhir.
‫Jadi kita katakan proses. nextTick, dan kemudian seperti sebelumnya, kami
‫hanya memberikannya fungsi panggilan balik.
‫Dan lagi, saya hanya ingin masuk ke
‫konsol, dan saya akan mengatakan proses. berikutnyaCentang.
‫Jadi menurut Anda apa yang akan terjadi dalam kasus ini?
‫Silakan dan tebak, dan setelah Anda siap, Anda dapat
‫menjalankan ini, jadi ayo lakukan itu.
‫Simpan di sini dulu, jalankan, dan ini dia.
‫Jadi hasilnya masuk lagi, dan sekarang panggilan balik
‫pertama yang dieksekusi sebenarnya adalah fungsi ini di sini.
‫Makanya ada prosesnya. nextTick kanan
‫di yang pertama.
‫Jadi mengapa fungsi panggilan balik ini dari proses. nextCentang yang pertama
‫dari semuanya yang akan dieksekusi?
‫Nah, ingat bahwa nextTick adalah
‫bagian dari antrian microtasks, yang dieksekusi setelah
‫setiap fase, jadi tidak hanya setelah satu centang penuh.
‫Jadi yang terjadi di sini
‫adalah fungsi callback ini sebenarnya berjalan sebelum fase di mana fungsi
‫callback ini berjalan, dan fase sebelumnya, oke.
‫Sekarang nextTick sebenarnya adalah nama yang menyesatkan, karena
‫tick sebenarnya adalah seluruh loop, tapi
‫nextTick sebenarnya terjadi sebelum fase loop berikutnya, dan
‫bukan seluruh tick, jadi itulah yang saya katakan sebelumnya.
‫Kemudian di sisi lain, setImmediate akan membuat
‫Anda berpikir bahwa panggilan baliknya akan segera
‫dieksekusi, tetapi sebenarnya tidak, kan, jadi
‫setImmediate sebenarnya dieksekusi sekali
‫per centang, sementara nextTick segera dieksekusi.
‫Jadi dua nama mereka sebenarnya harus diganti.
‫Mereka seharusnya sebaliknya, dan ini dapat
‫menyebabkan banyak kebingungan, jadi
‫yang terbaik adalah selalu berpegang pada salah satunya, dan
‫itu biasanya setImmediate dan bukan proses. berikutnyaCentang.
‫Sekarang, seperti yang saya sebutkan di video
‫terakhir, mekanisme ini sebenarnya lebih untuk kasus penggunaan yang cukup
‫canggih, itulah sebabnya kami
‫mungkin tidak akan menggunakannya dalam proyek kami.
‫Tetapi jika Anda ingin mempelajari lebih
‫lanjut tentang mereka, Anda selalu dapat membaca dokumentasi Node resmi.
‫Oke, jadi dengan ini kami telah mensimulasikan
‫beberapa aspek dari loop acara, tetapi untuk
‫menyelesaikannya, saya ingin memperkenalkan sesuatu tentang
‫kumpulan utas dengan cepat juga, dan untuk itu
‫kami akan melakukan operasi yang lebih kompleks yang
‫sebenarnya akan diturunkan ke kumpulan utas, dan
‫lihat berapa lama operasi ini berjalan, dan bagaimana kita dapat
‫mengubah ukuran kumpulan
‫utas yang telah kita bicarakan sebelumnya.
‫Jadi kita akan menggunakan beberapa
‫kriptografi di sini untuk mengenkripsi kata sandi.
‫Jadi itu adalah paket baru yang belum
‫pernah kami gunakan sebelumnya, dan itu disebut Crypto, tapi saya
‫sebutkan sebelumnya bahwa sebenarnya, semua fungsi dari paket ini,
‫mereka akan diturunkan secara otomatis oleh loop acara ke kumpulan
‫utas, dan itulah yang kami 're
‫akan menguji sekarang.
‫Dan mari kita gunakan ini sekarang, jadi kripto. pb, jadi kita akan menggunakan
‫fungsi enkripsi yang disebut pbkdf2, nama yang agak
‫aneh, dan sekarang kita memasukkan string rahasia, yang katakan
‫saja kata sandi, lalu kita perlu string untuk memecahkan
‫kata sandi, dan implementasinya di sini tidak
‫terlalu penting, jadi untuk saat ini saya tidak
‫akan membahas detail cara kerjanya,
‫kita akan melakukannya nanti, oke, jadi di sini
‫kita hanya perlu panjang kunci,
‫jadi nomor ini
‫di sini hanya untuk jumlah iterasi, lalu ini adalah panjang
‫kunci, dan akhirnya algoritma, yang
‫akan digunakan untuk mengenkripsi kata sandi.
‫Jadi angka-angka ini hanya akan
‫menambah waktu yang dibutuhkan untuk enkripsi.
‫Oke dan akhirnya, itu juga membutuhkan fungsi panggilan balik, dan yang akan saya lakukan di
‫sini adalah melakukan konsol lain. log,
‫dan katakan saja kata sandi terenkripsi.
‫Sekarang, untuk tujuan demonstrasi ini, saya
‫sebenarnya ingin menunjukkan kepada Anda berapa banyak waktu
‫yang dibutuhkan setiap operasi ini, jadi apa
‫yang akan kita lakukan pada dasarnya adalah mendefinisikan sebuah variabel di
‫awal, mengaturnya ke tanggal. sekarang, jadi itu adalah tanggal saat ini
‫dalam milidetik, dan kemudian di sini, yang harus kita lakukan adalah mencatat
‫tidak hanya string, tetapi juga tanggal. sekarang, yang akan menjadi tanggal
‫pada titik ini dalam milidetik, dikurangi awal,
‫dan kemudian akan memberi kita jumlah milidetik
‫yang telah berlalu untuk
‫melakukan perhitungan ini.
‫Oke, jadi mari kita
‫coba, simpan, dan jalankan lagi, dan di sini Anda
‫melihat bahwa butuh 1855 milidetik, jadi
‫hampir dua detik untuk mengenkripsi kata sandi ini.
‫Oke, tapi sekarang mari kita menduplikasi kode ini,
‫atau sebenarnya saya ingin empat
‫contoh ini menunjukkan sesuatu kepada Anda.
‫Jadi jika kita menjalankan ini sekarang, mungkin dibutuhkan waktu
‫yang kira-kira sama, dan ya, jadi
‫itu 1. 8
‫detik, sekarang 2. 2 detik, yang sangat mirip.
‫Oke, dan ingat bahwa saya memberi tahu Anda di
‫salah satu kuliah sebelumnya, bahwa secara
‫default ukuran kumpulan utas adalah empat, jadi ada
‫empat utas yang melakukan pekerjaan pada saat
‫yang sama, dan itulah mengapa keempat enkripsi
‫kata sandi ini memakan waktu kira-kira
‫waktu yang sama dan
‫terjadi pada dasarnya semua pada waktu yang sama.
‫Tapi kita sebenarnya bisa mengubah ukuran kumpulan utas itu.
‫Jadi, izinkan saya menunjukkan kepada Anda bagaimana kami melakukannya, dan kami
‫melakukannya dengan mengatakan proses. env, dan
‫itu adalah variabel lingkungan, dan
‫sekali lagi kita akan membicarakannya nanti, dan
‫UV, yang merupakan singkatan dari
‫LibUV, ukuran kumpulan utas, jadi jika kita menyetel ini ke satu, kita
‫hanya akan memiliki satu utas di kumpulan utas kita.
‫Jadi mari kita coba lagi, dan mari kita lihat apa yang terjadi sekarang.
‫Jadi Anda melihat bahwa mereka semua membutuhkan waktu lebih lama untuk menghitung.
‫Pada dasarnya, mereka dihitung satu demi satu.
‫Jadi yang ini yang pertama, lalu yang ini di sini
‫membutuhkan waktu dua kali lipat, dan sekali
‫lagi itu karena yang ini hanya bisa dimulai
‫segera setelah yang pertama selesai, dan sama
‫dengan yang ketiga dan keempat.
‫Sekarang katakanlah kita mengubahnya
‫menjadi dua, maka kita akan melihat dua
‫yang pertama dengan waktu yang sama, dan tepatnya,
‫dua yang kedua juga dengan waktu yang sama.
‫Jadi masuk akal, kan.
‫Hanya demi penyelesaian di
‫sini, sekarang sama dengan tiga, jadi ketiganya memiliki waktu
‫yang sama, dan kemudian yang terakhir.
‫Baiklah, jadi beginilah cara kerja kumpulan utas pada dasarnya, jadi saya
‫memutuskan untuk tidak hanya fokus pada loop peristiwa,
‫tetapi juga memberi Anda gambaran umum, yang sangat cepat, tentang kumpulan
‫utas dan bagaimana kita dapat mengubah
‫ukuran kumpulan utas , oke, perlu diingat
‫bahwa kode ini di
‫sini sebenarnya masih asinkron, karena kami melewati fungsi panggilan balik.
‫Oke, dan kita sebenarnya bisa menggunakan versi sinkron, tapi
‫itu akan memblokir loop acara.
‫Ingin melihat itu?
‫Jadi izinkan saya dengan cepat menunjukkannya kepada Anda juga,
‫sehingga yang satu itu tidak benar-benar
‫direncanakan, tetapi mari kita lakukan, karena menurut
‫saya sangat menarik untuk dilihat.
‫Oke, jadi itu akan berfungsi seperti ini.
‫Kami menggunakan lagi versi sinkronisasi dari fungsi yang
‫sama, yang catatan, tersedia berkali-kali.
‫Ingat kami memiliki yang sama untuk file baca, jadi
‫kami telah membaca file, yang menerima
‫panggilan balik, dan kami telah membaca sinkronisasi file, yang merupakan
‫versi sinkron yang tidak menerima panggilan balik, jadi seperti ini.
‫Jadi yang ini kemudian akan
‫mengenkripsi kata sandi, memblokir eksekusi kode, dan kemudian pindah ke baris
‫berikutnya, yang kemudian akan mencatatnya di sini ke konsol.
‫Jadi sekarang mari kita duplikat ini di sini.
‫Itu terlalu banyak, singkirkan yang ini di sini,
‫dan sekarang keempat enkripsi kata sandi ini tidak akan lagi
‫berjalan di loop acara.
‫Jadi mereka tidak akan lagi diturunkan ke kumpulan utas.
‫Oke, dan sekarang bahkan jika kita memiliki kumpulan utas
‫berukuran empat, mari kita lihat apa yang terjadi.
‫Jadi Anda lihat, itu terjadi sepenuhnya dengan cara yang sinkron.
‫Jadi satu demi satu, dan yang lebih buruk
‫lagi, adalah semua timer
‫ini di sini, bahkan nextTick dan
‫yang langsung, hanya muncul setelah enkripsi kata sandi terjadi.
‫Jadi ini benar-benar memblokir seluruh eksekusi, bahkan jika pengatur
‫waktu ini di sini, misalnya yang ini
‫di sini, selesai setelah nol detik,
‫dan yang ini setelah
‫tiga detik, tetapi mereka semua harus menunggu
‫tujuh detik sampai semua enkripsi kata
‫sandi ini di sini akhirnya siap, sekali lagi karena mereka tidak
‫berjalan di dalam loop acara, tetapi ini.
‫Jadi mereka pada dasarnya bekerja di latar belakang
‫dan hanya dapat diambil
‫oleh loop peristiwa ketika mereka siap,
‫tepat setelah empat enkripsi kata sandi ini,
‫jadi yang ini adalah contoh bagus lainnya
‫untuk melihat pemblokiran kode dan loop peristiwa semuanya beraksi.
‫Oke, cukup untuk satu kuliah, saya harap Anda
‫menganggapnya menarik, dan
‫sampai jumpa di kuliah berikutnya.