Rumah > Artikel > hujung hadapan web > Penjelasan terperinci tentang penggunaan Janji dalam JavaScript dengan contoh_Pengetahuan asas
Petikan – Parse JavaScript SDK kini menyediakan mod Promises yang serasi dengan jquery yang menyokong kebanyakan kaedah tak segerak, jadi apakah maksudnya, anda akan faham selepas membaca perkara berikut.
"Janji" mewakili paradigma hebat seterusnya dalam pengaturcaraan JavaScript, tetapi memahami sebab ia begitu hebat bukanlah mudah. Intinya ialah janji mewakili hasil tugasan, yang mungkin diselesaikan atau tidak. Satu-satunya antara muka yang diperlukan oleh mod Promise ialah untuk memanggil kaedah kemudian, yang boleh digunakan untuk mendaftarkan fungsi panggil balik yang dipanggil apabila janji selesai atau gagal Perkara ini biasanya dibincangkan dalam Cadangan CommonJS/A. Contohnya, saya ingin menyimpan objek Prase.Object Ini ialah operasi tak segerak Dalam paradigma panggil balik lama, kod anda mungkin ditulis seperti ini:
object.save({ key: value }, { success:function(object) { // the object was saved. }, error:function(object, error) { // saving the object failed. } }); 在新的Promise范式中,同样的代码你可以这样写: object.save({ key: value }).then( function(object) { // the object was saved. }, function(error) { // saving the object failed. });
Tidak banyak perbezaan? Jadi apa masalahnya? Nah, kuasa sebenar janji ialah rantaian gandaan Apabila promise.then(func) dipanggil, janji baru dikembalikan, yang tidak dilaksanakan sehingga yang sebelumnya selesai. Tetapi terdapat kes khas di sini, jika panggilan balik saya mengembalikan janji baru melalui masa itu, maka janji yang dikembalikan melalui kemudian tidak akan dilaksanakan sehingga pelaksanaan panggilan balik selesai. Sila rujuk Janji/A untuk butiran Ini adalah peraturan yang kompleks. Kita boleh memahaminya dengan lebih jelas melalui contoh.
Katakan anda menulis kod log masuk yang mencari objek dan kemudian mengemas kininya. Dalam paradigma panggil balik lama, anda boleh menggunakan penyelesaian kod piramid:
Parse.User.logIn("user","pass", { success:function(user) { query.find({ success:function(results) { results[0].save({ key: value }, { success:function(result) { // the object was saved. } }); } }); } });
Ini sudah kelihatan tidak masuk akal, tetapi yang lebih tidak masuk akal ialah tiada sebarang pengendalian ralat. Tetapi struktur rantai janji menjadikan kod kelihatan lebih selesa:
Parse.User.logIn("user","pass").then(function(user) { returnquery.find(); }).then(function(results) { returnresults[0].save({ key: value }); }).then(function(result) { // the object was saved. });
Wah!
Ralat pengendalian
Kod di atas tidak menambah pengendalian ralat apabila ia mudah, tetapi selepas menambahkannya, anda akan mendapati bahawa ia adalah kucar-kacir dalam kod panggil balik lama:
Parse.User.logIn("user","pass", { success:function(user) { query.find({ success:function(results) { results[0].save({ key: value }, { success:function(result) { // the object was saved. }, error:function(result, error) { // An error occurred. } }); }, error:function(error) { // An error occurred. } }); }, error:function(user, error) { // An error occurred. } });
Memandangkan janji tahu sama ada pemprosesan selesai, ia boleh melepasi ralat tanpa melaksanakan sebarang panggilan balik sehingga ralat ditemui. Contohnya, kod di atas boleh dipendekkan sebagai:
Parse.User.logIn("user","pass").then(function(user) { returnquery.find(); }).then(function(results) { returnresults[0].save({ key: value }); }).then(function(result) { // the object was saved. },function(error) { // there was some error. });
Biasanya, pembangun berpendapat bahawa kegagalan janji tak segerak adalah bersamaan dengan membuang pengecualian. Malah, jika panggilan balik menimbulkan ralat, janji akan mengembalikan mesej kegagalan. Menghantar ralat kepada pengendali ralat yang tersedia seterusnya adalah sama dengan melontar pengecualian sehingga ia ditangkap.
jQuery, Tulang Belakang dan Parse
Terdapat banyak perpustakaan yang melaksanakan janji untuk digunakan oleh pembangun. Seperti jQuery's Deferred, Microsoft's WinJS.Promise, when.js, q dan dojo.Deferred.
Namun, ada sesuatu yang menarik untuk diketahui. Anda boleh membaca perbincangan permintaan tarik jQuery yang panjang dan menarik di sini Pelaksanaan jQuery tidak sepenuhnya mengikut peraturan Promises/A Kaedah pelaksanaan lain digunakan di banyak tempat. Jika pengendali ralat mengembalikan beberapa maklumat lain daripada hanya mengembalikan janji, kebanyakan pelaksanaan akan mempertimbangkan untuk mengendalikan ralat tanpa menyebarkan ralat. Walau bagaimanapun, jquery tidak berfikir untuk mengendalikan ralat ini di sini dan sebaliknya meneruskannya ke hadapan. Walaupun janji daripada sistem yang berbeza harus bercampur dengan lancar, anda masih harus berhati-hati. Satu masalah yang berpotensi ialah janji dikembalikan (menggantikan nilai asal) dalam pengendali ralat, kerana ia dilayan sama.
doFailingAsync().then(function() { // doFailingAsync doesn't succeed. },function(error) { // Try to handle the error. return"It's all good."; }).then(function(result) { // Non-jQuery implementations will reach this with result === "It's all good.". },function(error) { // jQuery will reach this with error === "It's all good.". });
Dalam versi terbaharu Backbone 0.9.10, kaedah async kini mengembalikan jqXHR, iaitu sejenis janji jQuery. Salah satu matlamat Parse JavaScript SDK adalah untuk serasi dengan Backbone yang mungkin. Kami tidak boleh mengembalikan jqXHR kerana ia tidak berfungsi dengan baik dengan Cloud Code tambah kelas Parse.Promise, Ia mengikut piawaian Tertunda jQuery. Parse JavaScript SDKVersi terkini telah mengemas kini semua kaedah tak segerak untuk menyokong objek baharu ini dan kaedah panggil balik lama masih tersedia. Tetapi berdasarkan contoh yang disenaraikan di atas, saya percaya anda lebih suka cara baharu. Jadi cuba janji!