‫Instruktur: Sekarang mari luangkan waktu sebentar untuk mempelajari
‫tentang sifat asinkron dari Node.js. js,
‫yang mencakup topik yang sangat
‫mendasar, seperti kode sinkron, asinkron,
‫pemblokiran, dan non-pemblokiran.
‫Dan semua ini akan sangat penting
‫untuk memahami segala sesuatu yang muncul di seluruh
‫bagian ini.
‫Jadi potongan kode yang kita tulis di
‫kuliah terakhir, untuk membaca file dan kemudian, menyimpan isinya ke
‫dalam variabel, disebut dengan cara sinkron,
‫yang berarti bahwa setiap
‫pernyataan pada dasarnya diproses satu demi satu, baris dengan garis.
‫Dalam
‫contoh ini, pertama, modul sistem file
‫diperlukan, kemudian, file dibaca,
‫dan kemudian, kami mencatat hasilnya ke konsol.
‫Jadi Anda melihat bahwa setiap
‫baris kode pada dasarnya menunggu hasil dari baris sebelumnya.
‫Sekarang, ini bisa menjadi masalah,
‫terutama dengan operasi yang
‫lambat, karena setiap baris memblokir eksekusi
‫kode lainnya.
‫Jadi, kami mengatakan bahwa
‫kode sinkron juga disebut kode pemblokiran karena, sekali
‫lagi, operasi tertentu hanya dapat
‫dijalankan setelah yang sebelumnya selesai.
‫Dan karena cara Node. js dirancang, ini
‫berubah menjadi masalah besar, seperti yang akan kita lihat
‫secara detail di slide berikutnya.
‫Jadi solusi untuk masalah ini
‫di Node adalah dengan menggunakan kode non-blocking asynchronous.
‫Jadi dalam kode asinkron, kami mengunggah pekerjaan
‫berat untuk dikerjakan di latar belakang.
‫Dan kemudian, setelah pekerjaan itu
‫selesai, fungsi panggilan balik yang kita
‫daftarkan sebelumnya dipanggil untuk menangani hasilnya.
‫Dan selama
‫itu, sisa kode masih bisa dieksekusi
‫tanpa terhalang oleh tugas berat,
‫yang sekarang berjalan di latar belakang.
‫Jadi ini berarti bahwa kita dapat secara efektif
‫menunda atau bereaksi ke
‫masa depan untuk membuat kode non-blocking
‫dan ini, tentu saja, jauh lebih baik.
‫Masuk akal?
‫Jadi, dalam contoh ini, kami
‫menggunakan fungsi readFile asinkron, yang menerima fungsi panggilan balik.
‫Ini akan mulai membaca file
‫di latar belakang dan kemudian, segera beralih ke
‫pernyataan berikutnya, mencetak file pembacaan string ke konsol.
‫Jadi, sekali lagi, kami tidak memblokir eksekusi di sini.
‫Kemudian, ketika file akhirnya selesai dibaca, fungsi
‫panggilan balik akan
‫dipanggil, dan data yang telah
‫dibaca akan dicetak ke konsol.
‫Jadi itu sangat
‫berbeda dari versi sinkron, bukan?
‫Sekarang, pertanyaannya di
‫sini adalah, mengapa sebenarnya harus seperti ini?
‫Apa masalah dengan memblokir eksekusi kode di Node.js? js?
‫Atau, dengan kata lain, mengapa kita benar-benar menggunakan panggilan balik
‫berkali-kali di Node.js? js?
‫Nah, mari kita cari tahu.
‫Dan untuk memahami pertanyaan-pertanyaan ini, hal pertama
‫yang perlu kita pahami adalah
‫fakta bahwa Node.js. js, yang
‫merupakan tempat aplikasi kita
‫berjalan, hanya ada satu utas.
‫Dan utasnya seperti sekumpulan instruksi yang
‫dijalankan di CPU komputer.
‫Jadi pada dasarnya, utas adalah
‫tempat kode kita sebenarnya dieksekusi di prosesor mesin.
‫Jadi, ingat, Node. js pada dasarnya adalah
‫utas tunggal dan karenanya, untuk setiap aplikasi, hanya ada satu utas.
‫Begitulah cara Node.js. js dirancang.
‫Sekarang, artinya semua pengguna yang
‫mengakses aplikasi Anda menggunakan utas yang sama, jadi,
‫pada dasarnya, mengakses utas yang sama.
‫Jadi, setiap kali mereka berinteraksi dengan aplikasi, kode
‫yang dijalankan untuk setiap pengguna
‫akan dieksekusi semua di utas yang sama di tempat yang
‫sama di komputer yang menjalankan aplikasi.
‫Dan itu benar tidak peduli jika
‫Anda memiliki lima pengguna, seperti dalam diagram ini, atau 5.000 atau 5 juta.
‫Baiklah?
‫Sekarang, ini juga berarti bahwa ketika satu pengguna
‫mengunci satu utas dengan kode sinkron,
‫seperti yang baru
‫saja kita lihat, maka semua pengguna
‫lain harus menunggu eksekusi itu selesai.
‫Dan itu mungkin bukan masalah besar
‫jika Anda memiliki lima pengguna, tetapi itu
‫pasti akan terjadi pada ribuan atau bahkan jutaan pengguna
‫pada saat yang bersamaan.
‫Jadi, bayangkan ada pengguna yang mengakses aplikasi Anda dan
‫ada file sinkron besar yang dibaca dalam kode Anda
‫yang membutuhkan waktu satu detik untuk dimuat.
‫Ini berarti, tentu saja, untuk satu detik
‫itu, semua pengguna lain
‫harus menunggu karena seluruh eksekusi diblokir selama satu detik itu.
‫Jadi, jika pengguna lain tersebut ingin melakukan beberapa tugas
‫sederhana, seperti masuk ke aplikasi
‫Anda atau hanya meminta beberapa data, mereka tidak akan dapat melakukannya.
‫Mereka harus menunggu sampai file selesai dibaca.
‫Hanya ketika itu terjadi, mereka akhirnya dapat melakukan tugas
‫yang lebih sederhana, satu demi satu.
‫Sekarang, harap dicatat, bahwa ini adalah versi yang sangat disederhanakan dari apa yang
‫sebenarnya terjadi di balik layar Node.js. js, itulah sebabnya
‫kami akan kembali ke semua ini
‫di bagian selanjutnya dan mendapatkan pemahaman yang lebih
‫dalam tentang bagaimana Node.js. js menangani kode asinkron di bawah tenda.
‫Tetapi pada titik
‫ini, ini cukup bagi Anda untuk memahami konsepnya.
‫Lebih baik untuk pergi selangkah demi
‫selangkah di sini dan
‫tidak membuatnya terlalu membingungkan sejak awal, oke?
‫Bagaimanapun, beginilah situasinya
‫dengan kode pemblokiran sinkron, yang
‫jelas merupakan pengalaman buruk bagi pengguna Anda.
‫Jadi, tugas Anda sebagai pengembang adalah
‫menghindari situasi seperti ini dengan
‫menggunakan kode asinkron.
‫Jadi, untuk situasi yang sama, tentu saja kita
‫harus menggunakan fungsi baca file asinkron,
‫yang alih-alih memblokir utas
‫tunggal, melakukan pekerjaan berat di latar
‫belakang, di mana pada dasarnya tetap
‫sampai selesai membaca data dari file.
‫Tentu saja, kami kemudian juga mendaftarkan
‫fungsi panggilan balik untuk dipanggil setelah data tersedia.
‫Dan dalam skenario ini, semua pengguna
‫lain kemudian dapat melakukan tugas mereka dalam
‫satu utas, satu demi satu, saat file masih dibaca
‫di latar belakang.
‫Sekarang, setelah data dibaca, fungsi panggilan balik kami,
‫tentu saja, akan dipanggil
‫untuk dieksekusi di utas tunggal utama untuk memproses data yang dibaca.
‫Dan itu saja.
‫Itulah gambaran tentang bagaimana Node. js
‫menangani perilaku asinkron untuk mengimplementasikan model
‫I/O non-blocking yang kita bicarakan
‫di kuliah pendahuluan, oke?
‫Dan I/O adalah singkatan dari input-output, yang
‫pada dasarnya adalah hal-hal seperti mengakses sistem
‫file dan menangani permintaan jaringan.
‫Ini sebenarnya alasan mengapa Node.js. js sepenuhnya dirancang
‫seputar panggilan balik, seperti yang akan
‫Anda lihat di sepanjang kursus.
‫Dalam bahasa pemrograman lain, seperti PHP, cara kerjanya
‫sangat berbeda karena pada dasarnya Anda mendapatkan satu utas
‫baru untuk setiap pengguna baru, yang
‫merupakan paradigma yang sama sekali berbeda
‫dan benar-benar bekerja dengan cara yang sangat berbeda.
‫Tapi pencipta Node. js menemukan model
‫ini sebagai solusi terbaik untuk membangun aplikasi web
‫yang berperforma tinggi dan skalabel.
‫Sekarang, sebagai catatan terakhir di sini, penting untuk diketahui bahwa,
‫ketika kita menggunakan panggilan
‫balik dalam kode kita, itu tidak secara otomatis membuatnya asinkron, oke?
‫Jadi, meneruskan fungsi ke fungsi lain
‫cukup umum di
‫JavaScript, tetapi tentu saja, sekali lagi,
‫itu tidak membuatnya asinkron secara otomatis, oke?
‫Ini hanya berfungsi dengan cara ini untuk beberapa fungsi di Node
‫API, seperti fungsi readFile dan
‫banyak lagi, seperti yang dijelajahi orang di masa mendatang.
‫Dan sekarang, hanya untuk
‫menyelesaikan, karena kita berbicara tentang kode asinkron di
‫sini, hanya satu catatan terakhir tentang fungsi panggilan balik.
‫Jadi, model panggilan balik yang baru saja kita
‫bahas, di mana satu
‫fungsi dipanggil setelah yang sebelumnya selesai bekerja,
‫dapat dengan cepat menyebabkan beberapa kode yang sulit dibaca dan tidak dapat dikelola.
‫Ambil saja contoh ini di mana pembacaan file
‫kedua bergantung pada yang
‫pertama, kemudian, pembacaan file ketiga bergantung pada yang
‫kedua, dan akhirnya, kami ingin menggunakan data
‫akhir untuk menulis file sebagai hasilnya.
‫Itu terlihat cukup membingungkan, bukan?
‫Maksud saya, ini akan bekerja
‫dengan baik, tapi itu sulit untuk
‫dipikirkan dan itu hanya dengan empat level.
‫Bayangkan Anda memiliki 10 atau 20
‫level, yang sebenarnya tidak biasa.
‫Bagaimanapun, ini adalah apa yang kita sebut neraka panggilan balik.
‫Ini adalah masalah umum,
‫yang sudah punya nama sendiri.
‫Dan apakah Anda memperhatikan bentuk segitiga ini di sini?
‫Itu tanda yang sangat jelas bahwa Anda berada di neraka panggilan balik.
‫Sekarang, bagaimana kita benar-benar lolos dari panggilan balik neraka?
‫Yah, kita dapat menggunakan alat yang lebih
‫canggih untuk menangani kode asinkron, seperti
‫janji ES6 atau bahkan lebih baik, ES8 asinkron/menunggu.
‫Sekarang, model yang baru saja kita
‫bicarakan akan tetap sama.
‫Kami hanya memiliki cara yang
‫lebih elegan untuk menangani kode itu sendiri dan menulisnya.
‫Dan ada bagian opsional
‫secara keseluruhan nanti dalam kursus tentang janji dan juga, async/menunggu,
‫jadi jika Anda tidak terbiasa dengannya.
‫Tetapi untuk saat ini, kami akan
‫tetap menggunakan callback karena itulah yang digunakan
‫dan dirancang oleh Node.
‫Dan sekarang, dengan itu,
‫mari kita lanjutkan dan gunakan model asinkron ini
‫dalam praktik untuk pertama kalinya.