Saya telah melakukan Javascript berbasis web (vanilla JS, jQuery, Backbone, dll) selama beberapa tahun sekarang, dan baru-baru ini saya telah melakukan beberapa pekerjaan dengan Node.js. Butuh beberapa saat untuk memahami pemrograman "non-blocking", tetapi sekarang saya sudah terbiasa menggunakan callback untuk operasi IO dan yang lainnya.
Saya mengerti bahwa Javascript bersifat single-threaded. Saya mengerti konsep Node "event queue". Apa yang saya TIDAK mengerti adalah apa yang menentukan apakah operasi javascript individu adalah "memblokir" vs "non-memblokir". Bagaimana saya tahu operasi mana yang bisa saya andalkan untuk menghasilkan output secara sinkron untuk saya gunakan dalam kode nanti, dan yang mana saya harus meneruskan panggilan balik agar saya dapat memproses output setelah operasi awal selesai? Apakah ada daftar fungsi Javascript di suatu tempat yang asinkron / non-pemblokiran, dan daftar yang fungsi sinkronisasi / pemblokiran? Apa yang mencegah aplikasi Javascript saya menjadi satu kondisi ras raksasa?
Saya tahu bahwa operasi yang membutuhkan waktu lama, seperti operasi IO dalam operasi Node dan AJAX di web, mengharuskan mereka untuk tidak sinkron dan karenanya menggunakan panggilan balik - tetapi siapa yang menentukan apa yang memenuhi syarat sebagai "waktu yang lama"? Apakah ada semacam pemicu dalam operasi ini yang menghilangkannya dari "antrian acara" yang normal? Jika tidak, apa yang membuatnya berbeda dari operasi sederhana seperti memberikan nilai ke variabel atau mengulang melalui array, yang tampaknya dapat kita andalkan untuk diselesaikan secara sinkron?
Mungkin saya bahkan tidak memikirkan hal ini dengan benar - berharap seseorang dapat meluruskan saya. Terima kasih!
Jawaban:
Secara umum, fungsi apa pun yang melakukan networking atau menggunakan timer untuk melakukan berbagai hal selama periode waktu akan asinkron.
Jika fungsi menerima panggilan balik, Anda dapat melihat untuk apa panggilan balik itu digunakan dan biasanya akan jelas apakah asinkron atau tidak. Jika fungsi tidak menawarkan panggilan balik, maka ia tidak memiliki cara untuk mengkomunikasikan hasil asinkron sehingga mungkin tidak asinkron.
Tidak ada cara yang pasti untuk mengatakannya. Itu harus dijabarkan dalam dokumen untuk fungsi atau jelas dari cara antarmuka bekerja.
Operasi asinkron berbeda di bawah penutup daripada operasi sinkron dalam operasi asynch memiliki gagasan untuk mengatur operasi, memulai operasi dan kemudian mendapatkan pemberitahuan nanti tentang kemajuan, penyelesaian atau kesalahan dalam operasi. Iterasi array adalah operasi yang sinkron. Tidak ada masalah ini. Kode hanya berjalan secara sinkron. Mengeluarkan panggilan ajax terdiri dari mendaftarkan panggilan balik untuk pemberitahuan keadaan, kemudian memulai panggilan ajax, kemudian melanjutkan untuk menjalankan javascript lainnya dan kemudian beberapa waktu kemudian, panggilan balik dipanggil dengan perubahan keadaan pada panggilan ajax (seperti penyelesaian).
sumber
XMLHttpRequest.open
memilikiasync
parameter boolean yang mengontrol apakah panggilan nantisend
adalah tidak sinkron.Dari apa yang saya mengerti Anda tidak bertanya tentang apa yang harus Anda buat asinkron tetapi bagaimana cara mengetahui apakah suatu fungsi asinkron.
Anda memeriksa dokumentasinya. Serius - itu untuk apa. Anda tidak menebak apa fungsi tidak berdasarkan nama atau konteksnya begitu saja. Jika Anda tidak yakin dan memiliki akses ke kode sumbernya, Anda memeriksanya.
Itu satu-satunya cara yang sepenuhnya dapat diandalkan.
Sekarang untuk menebak-nebak.
sumber
Karena JavaScript adalah utas tunggal semua blok pemrosesan hingga salah satu dari yang berikut terjadi
1) Eksekusi saat ini meminta layanan eksternal seperti I / O atau permintaan jaringan, atau permintaan webworker
2) Panggilan fungsi diletakkan pada timer untuk dieksekusi di lain waktu
Tidak ada daftar fungsi pemblokiran / non-pemblokiran. Anda harus memeriksa dokumentasinya.
Aplikasi Anda dapat mengalami kondisi balapan jika beberapa layanan eksternal memiliki kunci di utas javascript dan mencoba mengaksesnya pada saat yang sama. Peramban modern dan mesin V8 menangani ini, tetapi Anda mungkin menghadapi kondisi lomba ini jika Anda menggunakan phonegap dan menulis aplikasi javascript untuk perangkat seluler. Dukungan tidak ada untuk menangani kondisi balapan ini.
Secara umum, anggap blok kode kecuali ada panggilan balik. Dan bahkan jika ada panggilan balik, itu tidak berarti itu tidak akan diblokir.
sumber
Saya juga baru di node.js (dan JavaScript pada umumnya) dan saya tidak terbiasa dengan kode asinkron. Saya hanya ingin menunjukkan bahwa dalam Ikhtisar Pemblokiran vs Non-Pemblokiran pada nodejs.org menyatakan bahwa:
sumber