Kerja saya menjadi lebih mudah baru-baru ini, dan saya teringat janji perkataan yang selalu saya lihat sebelum ini, jadi saya dengan sabar mengkajinya untuk seketika.
1: Apa itu Janji? Kenapa ada benda ni?
Pertama sekali, Promise dicipta untuk menyelesaikan masalah penulisan kod dalam pengaturcaraan asynchronous javascript.
Dengan pembangunan JavaScript, terdapat lebih banyak senario tak segerak. Bahagian hadapan mempunyai AJAX, setTimeout, dsb., dan Nod bahagian belakang lebih tidak segerak. Mengikut pendekatan tradisional, pelbagai panggilan balik dibenamkan dalam panggilan balik. Kod boleh mengelirukan.
Pada masa ini, komuniti CommonJS mencadangkan spesifikasi yang dipanggil Promise/A, yang mentakrifkan cara menulis kod tak segerak, termasuk menggunakan when/then/resolve, dsb. untuk mengatur kod tak segerak.
Oleh kerana spesifikasi ini sangat elegan, ramai orang telah melaksanakannya, termasuk Promise() yang disokong secara asli oleh penyemak imbas, ditangguhkan dalam jQuery, when.js, dsb.
Oleh kerana perpustakaan ini semuanya mematuhi spesifikasi ini, cukup untuk mempelajarinya. Saya terutamanya mempelajari jQuery yang ditangguhkan, jadi artikel ini terutamanya bercakap tentang pelaksanaan ini.
Dua: jQuery ditangguhkan
Pertama sekali, mengenai objek tertunda, cikgu Ruan Yifeng telah menulis artikel yang sangat terperinci, alamatnya di sini. Disarankan anda membaca artikel beliau dahulu dan kemudian teruskan membaca.
Seperti yang dinyatakan di atas, janji digunakan untuk menyelesaikan masalah tak segerak (seperti ajax), jadi mari kita bandingkan perbezaannya.
Kaedah penulisan jQuery AJAX klasik ialah
Parameter kejayaan dan ralat ialah fungsi panggil balik apabila kejayaan/kegagalan berlaku.
Dan kini kaedah penulisan AJAX jQuery telah menjadi
Selepas berjaya, fungsi yang dilakukan akan dipanggil, dan apabila gagal, fungsi yang gagal akan dipanggil.
Apabila anda melihat ini, anda mungkin mempunyai soalan pada objek manakah terletaknya kaedah selesai/gagal? Apakah objek yang $.ajax() kembalikan dan mengapa terdapat dua kaedah ini?
Jawapannya terletak pada objek Tertunda yang diperkenalkan di bawah.
jQuery menyediakan jenis baharu Tertunda. Dijana melalui $.Deferred(). Contohnya
Definisi ini mewarisi banyak kaedah, termasuk selesai/gagal/selesaikan/tolak, dsb.
Jadi di sini kita juga tahu bahawa $.ajax() di atas sebenarnya mengembalikan objek ini.
Objek tertunda mempunyai banyak kaedah. Berikut adalah beberapa kaedah yang biasa digunakan. Untuk maklumat lanjut, sila rujuk API
Perkara pertama ialah menjana objek def secara semula jadi. Terdapat banyak kaedah di sini, seperti:
Di sini, $.when() boleh dibincangkan secara berasingan Kaedah ini biasanya menerima satu atau lebih objek tertunda, dan kemudian menentukan keadaan objek yang dikembalikan oleh $.when() berdasarkan status objek tertunda ini. Satu senario penggunaan ialah berbilang permintaan ajax Jika salah satu daripadanya gagal, semuanya akan dianggap gagal Kemudian anda boleh lulus dalam berbilang kaedah ajax dalam $.when(), seperti $.when($.ajax(), $. ajax()). Kemudian $.when akan mengembalikan objek def (dinilai berdasarkan keputusan kedua-dua permintaan ini).
Kemudian selepas mendapat objek def, terdapat satu siri kaedah untuk mengubah keadaan objek ini
Langkah seterusnya ialah menetapkan kaedah panggil balik Susunan yang sepadan dengan yang di atas, iaitu panggilan balik yang akan dipanggil dalam keadaan apa
Malah, pada ketika ini, penggunaan objek tertunda adalah hampir sama. Walau bagaimanapun, jQuery juga menyediakan beberapa API
Seperti yang dicadangkan oleh nama-nama API ini, saya tidak akan pergi ke butiran Untuk butiran, anda boleh menyemak dokumentasi API jQuery yang diberikan di atas.
Terdapat kaedah lain, iaitu, kadang-kadang kita ingin memberikan objek def luaran, dan kemudian objek ini boleh menetapkan panggilan balik untuk pelbagai keadaan, tetapi tidak boleh mengubah keadaannya, maka kita boleh menggunakan
Mengembalikan objek janji, yang merupakan subset objek tertunda Anda boleh menggunakan kaedah selesai/gagal dan kaedah lain tiada penyelesaian/tolak Ia adalah untuk melindungi keadaan objek def daripada diubah suai oleh luar.
Pada ketika ini, saya telah selesai bercakap tentang janji Anda kini boleh menggunakannya dalam projek anda sendiri. Selain itu, saya mengucapkan selamat tahun baru kepada anda semua dan mengucapkan selamat Tahun Domba.