Memahami JavaScript Segerak dan Tidak Segerak - Bahagian 1
Segerak dan asynchronous membingungkan konsep dalam JavaScript, terutamanya untuk pemula. Dua atau lebih banyak perkara bersegeralah apabila mereka berlaku pada masa yang sama (selari), dan asynchronous apabila mereka tidak (tidak selaras).
Walaupun definisi ini mudah untuk diambil, ia sebenarnya lebih rumit daripada kelihatan. Kita perlu mengambil kira apa sebenarnya yang disegerakkan, dan apa yang tidak.
Anda mungkin akan memanggil normal
berfungsi dalam JavaScript bersesuaian, kan? Dan jika ia seperti setTimeout ()
atau AJAX yang anda bekerjasama, anda akan merujuknya sebagai asynchronous, ya? Bagaimana jika saya memberitahu anda itu kedua-duanya tidak segerak dalam satu cara?
Untuk menerangkan kenapa, kita perlu beralih kepada Encik X untuk mendapatkan bantuan.
Senario 1 - Encik X sedang mencuba sinkronisme
Inilah persediaan:
- Encik X adalah seseorang yang boleh menjawab soalan yang sukar, dan menjalankan tugas yang diminta.
- Satu-satunya cara untuk menghubungi beliau ialah melalui panggilan telefon.
- Apa jua soalan atau tugas yang anda dapat, untuk meminta bantuan Encik X untuk menjalankannya; anda memanggilnya.
- Encik X memberi anda jawapan atau menyelesaikan tugas segera, dan membolehkan anda tahu sudah siap.
- Anda meletakkan kandungan perasaan penerima dan keluar untuk filem.
Apa yang baru sahaja anda lakukan ialah komunikasi segerak (belakang dan sebagainya) dengan Encik X. Dia mendengarkan kerana anda bertanya kepadanya soalan anda, dan anda mendengar apabila dia menjawabnya.
Senario 2 - Encik X tidak berpuas hati dengan penyelarasan
Oleh kerana Encik X sangat cekap, dia mula menerima lebih banyak panggilan. Jadi apa yang berlaku apabila anda memanggilnya tetapi dia sudah sibuk bercakap dengan orang lain? Anda tidak akan dapat menanya soalan anda - tidak sehingga dia boleh menerima panggilan anda. Apa yang kamu dengar adalah nada yang sibuk.
Jadi apa yang boleh dilakukan oleh Encik X untuk memerangi perkara ini?
Daripada mengambil panggilan terus:
- Encik X menyewa seorang lelaki baru, Encik M dan memberinya mesin penjawab untuk penelepon untuk meninggalkan mesej.
- Tugas M ialah lulus mesej dari mesin penjawab ke Mr X sebaik sahaja dia tahu Encik X telah selesai sepenuhnya memproses semua mesej sebelumnya dan sudah pun percuma untuk mengambil yang baru.
- Jadi sekarang apabila anda memanggilnya, bukannya mendapat nada yang sibuk, anda boleh meninggalkan mesej untuk Encik X, kemudian tunggu dia memanggil awak kembali (tiada masa filem lagi).
- Sebaik sahaja Encik X dilakukan dengan semua mesej beratur yang dia terima sebelum anda, dia akan melihat isu anda, dan hubungi anda semula untuk memberikan jawapan kepada anda.
Sekarang di sini terdapat persoalan: adakah tindakan-tindakan yang berlaku sekarang segerak atau tak segerak?
Ia bercampur. Apabila anda meninggalkan mesej anda, Encik X tidak mendengarnya, jadi komunikasi sebegini tidak segerak.
Tetapi, ketika dia menjawab, anda berada di sana mendengar, yang mana membuat komunikasi kembali menjadi segerak.
Saya harap sekarang anda telah memperoleh pemahaman yang lebih baik tentang bagaimana sinchronicity dilihat dari segi komunikasi. Masa untuk membawa JavaScript.
JavaScript - Bahasa Pemrograman Asynchronous
Apabila seseorang melabel JavaScript tidak segerak, apa yang mereka sebut secara umum ialah bagaimana anda boleh tinggalkan pesanan untuk itu, dan tidak mempunyai panggilan anda disekat dengan nada sibuk.
Panggilan fungsi adalah tidak pernah langsung dalam JavaScript, mereka betul-betul dilakukan melalui mesej.
JavaScript menggunakan a barisan mesej di mana mesej masuk (atau peristiwa) diadakan. An gelung acara (mesej dispatcher) secara berurutan menghantar mesej tersebut kepada a timbunan panggilan di mana fungsi-fungsi mesej yang sepadan adalah disusun sebagai bingkai (fungsi pertandingan & pemboleh ubah) untuk pelaksanaan.
Stack panggilan memegang rangka fungsi awal dipanggil, dan mana-mana bingkai lain untuk fungsi yang dipanggil melalui panggilan bersarang di atasnya .
Apabila mesej menyertai barisan, ia menunggu sehingga timbunan panggilan kosong dari semua bingkai dari mesej sebelumnya, dan apabila ia, gelung acara dequeues mesej sebelumnya, dan menambah bingkai mesej yang sedia ada kepada timbunan panggilan.
Mesej menunggu lagi sehingga stack panggilan menjadi kosong dari bingkai yang bersesuaian (iaitu eksekusi semua fungsi yang disusun selesai), kemudian ditakdirkan.
Pertimbangkan kod berikut:
fungsi foo () bar fungsi () foo (); fungsi baz () bar (); baz ();
Fungsi yang dijalankan adalah baz ()
(pada baris terakhir potongan kod), yang mana mesej ditambah ke baris gilir, dan apabila gelung acara mengambilnya, timbunan panggilan mula menyusun bingkai untuk baz ()
, bar ()
, dan foo ()
di tempat pelaksanaan yang relevan.
Sebaik sahaja pelaksanaan fungsi itu selesai satu demi satu, bingkai mereka adalah dikeluarkan dari timbunan panggilan, sementara mesej itu masih menunggu dalam barisan, sehingga baz ()
adalah muncul dari timbunan.
Ingat, panggilan fungsi adalah tidak pernah langsung dalam JavaScript, mereka sudah selesai melalui mesej. Oleh itu, apabila anda mendengar seseorang mengatakan bahawa JavaScript itu sendiri adalah bahasa pengaturcaraan tak segerak, anggap bahawa mereka bercakap tentang terbina dalamnya “mesin menjawab panggilan”, dan bagaimana anda bebas untuk meninggalkan mesej.
Tetapi bagaimana dengan kaedah tak segerak tertentu?
Setakat ini saya tidak menyentuh API seperti setTimeout ()
dan AJAX, mereka adalah yang secara khusus dirujuk sebagai asynchronous. Kenapa begitu?
Adalah penting untuk memahami apa sebenarnya sinkron atau tak segerak. JavaScript, dengan bantuan peristiwa dan gelung acara, mungkin berlatih pemprosesan mesej tak segerak, tetapi itu tidak bermakna semuanya dalam JavaScript adalah tidak segerak.
Ingat, saya memberitahu anda mesej itu tidak keluar sehingga stack panggilan itu kosong dari bingkai yang sepadan, sama seperti anda tidak meninggalkan filem sehingga anda mendapat jawapan anda bersesuaian, anda ada menunggu sehingga tugas selesai, dan anda mendapat jawapannya.
Menunggu tidak sesuai dalam semua senario. Bagaimana jika selepas meninggalkan mesej, bukan menunggu, anda boleh pergi untuk filem itu? Bagaimana jika fungsi boleh bersara (mengosongkan timbunan panggilan), dan mesejnya boleh ditakdirkan sebelum tugas selesai? Bagaimana jika anda boleh mempunyai kod yang dilaksanakan secara asynchronously?
Di sinilah API seperti setTimeout ()
dan AJAX masuk ke dalam gambar, dan apa yang mereka lakukan adalah ... terus, saya tidak dapat menjelaskannya tanpa kembali ke Mr X, yang akan kita lihat di bahagian kedua artikel ini. Tinggal.