Rumah  >  Artikel  >  hujung hadapan web  >  Penyongsangan Kawalan dalam Panggilan Balik JavaScript: Mengapa Janji adalah Jawapan

Penyongsangan Kawalan dalam Panggilan Balik JavaScript: Mengapa Janji adalah Jawapan

WBOY
WBOYasal
2024-08-09 06:33:02684semak imbas

Fungsi panggil balik ialah fungsi yang dihantar ke fungsi lain sebagai argumen, yang kemudiannya dipanggil di dalam fungsi luar untuk melengkapkan beberapa jenis rutin atau tindakan. Terdapat dua cara panggilan balik boleh dipanggil: segerak dan tak segerak. Ia ialah corak async paling asas dalam Javascript.

Contohnya:

Inversion of Control in JavaScript Callbacks: Why Promises are the Answer

A dan B berlaku sekarang, di bawah kawalan langsung program JS utama. Tetapi C akan ditangguhkan untuk berlaku kemudian, dan di bawah kawalan pihak lain, dalam kes ini, fungsi ajax(..). Dalam erti kata asas, pelepasan kawalan sedemikian tidak kerap menyebabkan banyak masalah untuk program.

Walau bagaimanapun, infrekuensi tidak mencukupi untuk mengabaikan masalah atau isu. Malah, ini adalah salah satu masalah utama reka bentuk dipacu panggilan balik. Ia berkisar pada idea bahawa kadangkala ajax(..) atau "pihak" yang anda hantar kesinambungan panggil balik anda bukanlah fungsi yang anda tulis atau yang anda kawal secara langsung. Banyak kali ia adalah utiliti yang disediakan oleh pihak ketiga.

Kami memanggil ini “penyongsangan kawalan” apabila anda mengambil sebahagian daripada program anda dan menyerahkan kawalan pelaksanaannya kepada pihak ketiga yang lain. Terdapat "kontrak" yang tidak dinyatakan yang wujud antara kod anda dan utiliti pihak ketiga — satu set perkara yang anda harapkan untuk dikekalkan.

Apakah masalah dengan "Penyongsangan Kawalan"?

Terdapat contoh untuk lebih memahami masalah ini.

Katakan anda sedang membina tapak web tempahan perjalanan untuk syarikat anda. Anda telah menambahkan butang "tempah sekarang" yang menggunakan fungsi createBooking() perpustakaan pihak ketiga. Fungsi ini memproses tempahan dan kemudian memanggil panggilan balik anda untuk menghantar e-mel pengesahan kepada pelanggan.

Kod ini mungkin kelihatan seperti:

Inversion of Control in JavaScript Callbacks: Why Promises are the Answer

Semuanya berfungsi dengan sempurna semasa ujian. Orang ramai mula menempah pakej pelancongan di tapak web anda dan semua orang gembira dengan kerja anda. Tiba-tiba, suatu hari, anda mendapat panggilan daripada bos anda mengenai isu besar. Seorang pelanggan menempah pakej dan menerima empat e-mel pengesahan yang sama untuk satu tempahan.

Anda mula menyahpepijat isu ini. Anda menyemak bahagian kod yang menghantar e-mel pengesahan, dan semuanya kelihatan betul. Anda kemudian menyiasat lebih lanjut dan mendapati bahawa utiliti createBooking() daripada pustaka pihak ketiga memanggil fungsi panggil balik anda empat kali, menyebabkan empat e-mel pengesahan dihantar.

Anda menghubungi pasukan sokongan perpustakaan pihak ketiga dan terangkan situasinya. Mereka memberitahu anda bahawa mereka tidak pernah menghadapi isu ini sebelum ini tetapi akan mengutamakannya dan menghubungi anda semula. Selepas sehari, mereka menghubungi anda semula dengan penemuan mereka. Mereka mendapati bahawa sekeping kod percubaan, yang tidak sepatutnya disiarkan secara langsung, telah menyebabkan fungsi createBooking() memanggil panggilan balik beberapa kali.

Isu itu menyebelahi mereka, dan mereka memberi jaminan kepada anda bahawa ia telah diselesaikan. Mereka memohon maaf atas masalah itu dan mengesahkan bahawa masalah itu tidak akan berlaku lagi.

Untuk mengelakkan sebarang isu yang tidak diingini seperti itu selepas beberapa pihak mencari penyelesaian, anda melaksanakan penyataan if mudah seperti berikut, yang mana pasukan nampaknya gembira dengan:

Inversion of Control in JavaScript Callbacks: Why Promises are the Answer

Tetapi kemudian salah seorang jurutera QA bertanya, "apa yang berlaku jika mereka tidak pernah menghubungi panggilan balik?" Aduh. Anda berdua tidak terfikir tentang itu!

Anda mula memikirkan semua kemungkinan perkara yang boleh menjadi salah apabila mereka memanggil balik anda. Berikut adalah senarai beberapa masalah:

  • Panggil panggilan balik terlalu awal

  • Panggil panggilan balik terlalu lewat (atau tidak pernah)

  • Panggil panggilan balik terlalu sedikit atau terlalu banyak kali (seperti masalah dalam contoh di atas)

  • Telan sebarang ralat/pengecualian yang mungkin berlaku

  • ...

Anda mungkin akan menyedari bahawa anda perlu melaksanakan banyak penyelesaian dalam kod anda untuk situasi yang berbeza, yang akan menjadikan kod itu buruk dan kotor kerana ia diperlukan dalam setiap panggilan balik yang dihantar kepada utiliti.

Janji

Bagaimana jika kita boleh menyahbalikkan penyongsangan kawalan itu? Bagaimana jika daripada meneruskan kesinambungan program kami kepada pihak lain, kami boleh menjangkakan ia akan mengembalikan keupayaan kami untuk mengetahui apabila tugasnya selesai, dan kemudian kod kami boleh memutuskan perkara yang perlu dilakukan seterusnya?

Janji menawarkan cara yang berkuasa untuk mengendalikan operasi tak segerak dalam JavaScript, menangani isu seperti neraka panggil balik dan penyongsangan kawalan. Tidak seperti panggilan balik, Promises membolehkan anda mengurus tugas tak segerak tanpa melepaskan kawalan kod anda.

Pertimbangkan untuk memesan burger keju di restoran makanan segera. Anda menerima resit, janji burger keju masa depan anda. Semasa anda menunggu, anda boleh melakukan perkara lain, mengetahui anda akan mendapat pesanan anda akhirnya. Begitu juga, Janji dalam JavaScript mewakili nilai masa hadapan, membolehkan kod anda berjalan dengan lancar.

Janji juga menangani kegagalan dengan anggun, sama seperti anda mungkin dimaklumkan jika restoran kehabisan burger keju. Struktur ini menjadikan kod anda lebih mudah dibaca dan diselenggara.

Saya tidak akan membincangkan Promises secara mendalam di sini, tetapi dengan menggunakannya, anda boleh menulis kod tak segerak yang lebih bersih dan boleh dipercayai, meningkatkan kualiti keseluruhan aplikasi JavaScript anda.

Sebagai contoh, untuk tapak web tempahan perjalanan yang kami nyatakan sebelum ini, jika utiliti pihak ketiga mengembalikan janji, kami boleh menanganinya seperti ini:

Inversion of Control in JavaScript Callbacks: Why Promises are the Answer

Setelah Janji diselesaikan (berjaya disempurnakan), ia kekal seperti itu selama-lamanya — ia menjadi nilai yang tidak berubah pada ketika itu dan kemudiannya boleh dipatuhi seberapa banyak yang perlu. Ini bermakna janji yang diselesaikan, nilai yang diselesaikan boleh diakses atau digunakan beberapa kali dalam kod anda tanpa menjejaskan keadaannya. Ini membolehkan anda mengendalikan hasil operasi tak segerak dalam pelbagai bahagian aplikasi anda tanpa perlu risau tentang Janji berubah atau dinilai semula.

Janji ialah penyelesaian untuk penyongsangan isu kawalan yang berlaku dalam kod panggil balik sahaja. Panggilan balik mewakili penyongsangan kawalan. Jadi penyongsangan corak panggil balik sebenarnya adalah penyongsangan penyongsangan, atau penyongsangan kawalan. Memulihkan kawalan kembali kepada kod panggilan yang kami mahukan berada di tempat pertama.

Rujukan

  • Anda Tidak Tahu JS: Async & Performance oleh Kyle Simpson

  • developer.mozilla.org

Atas ialah kandungan terperinci Penyongsangan Kawalan dalam Panggilan Balik JavaScript: Mengapa Janji adalah Jawapan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn