Apa yang menentukan fungsi Javascript mana yang memblokir vs yang tidak memblokir?


27

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!


ini adalah sesuatu yang saya temukan yang sangat berguna, meskipun jawaban Anda untuk pertanyaan Anda adalah bahwa Anda harus memeriksa dokumentasi untuk mengetahui apakah metode async.
Anastasios Andronidis

Jawaban:


13

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).


1
Sebagai catatan tambahan, beberapa fungsi Javascript keduanya memblokir dan tidak memblokir, tergantung pada parameternya. Misalnya, XMLHttpRequest.openmemiliki asyncparameter boolean yang mengontrol apakah panggilan nanti sendadalah tidak sinkron.
Brian

Saya hanya tidak menemukan jawaban ini bermanfaat dan dijelaskan secara umum.
Mehdi Raash

@MehdiRaash - Jawabannya adalah Anda mengetahuinya dari dokumentasi atau dari antarmuka. Tidak ada jalan lain. Itu yang dikatakan. Tidak yakin apa lagi yang Anda harapkan. Tidak ada jawaban peluru ajaib.
jfriend00

6

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.

  • Jika ia menerima panggilan balik atau mengembalikan janji itu mungkin tidak sinkron (saya telah melihat pengecualian untuk aturan itu)
  • Secara umum semua yang terkait dengan I / O di node.js dan lebih umum dalam JavaScript dilakukan secara tidak sinkron (saya juga melihat pengecualian pada aturan itu)

4

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.


-1

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:

Semua metode I / O di perpustakaan standar Node.js menyediakan versi asinkron, yang non-pemblokiran, dan menerima fungsi panggilan balik. Beberapa metode juga memiliki pemblokiran rekan, yang memiliki nama yang diakhiri dengan Sinkronisasi.


1
bagaimana ini menjawab pertanyaan yang diajukan? Lihat Bagaimana Menjawab
nyamuk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.