Rumah  >  Artikel  >  hujung hadapan web  >  Spesifikasi penulisan kod pengaturcaraan tak segerak JavaScript Janji nota kajian_kemahiran javascript

Spesifikasi penulisan kod pengaturcaraan tak segerak JavaScript Janji nota kajian_kemahiran javascript

WBOY
WBOYasal
2016-05-16 16:14:271022semak imbas

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

Salin kod Kod adalah seperti berikut:

$.ajax({
Taip: "dapat",
url: "",
Kejayaan: fungsi () {},
ralat; fungsi () {}
});

Parameter kejayaan dan ralat ialah fungsi panggil balik apabila kejayaan/kegagalan berlaku.

Dan kini kaedah penulisan AJAX jQuery telah menjadi

Salin kod Kod adalah seperti berikut:

$.ajax({
Taip; "dapat",
URL: ""
}).selesai(fungsi () {}).gagal(fungsi () {});

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

Salin kod Kod adalah seperti berikut:

var def = $.Deferred();

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:

Salin kod Kod adalah seperti berikut:

var def = $.Deferred(); // Jana sendiri
$.ajax({}); // Kaedah ajax juga mengembalikan objek def
$.when(); // kaedah bila juga akan mengembalikan objek def

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

Salin kod Kod adalah seperti berikut:

def.resolve(); // Tetapkan objek def kepada selesai, dan kemudian fungsi terikat dalam def.done() akan dilaksanakan serta-merta.
def.reject(); // Tetapkan objek def telah gagal, dan kemudian fungsi terikat dalam def.fail() akan dilaksanakan serta-merta.
def.notify(); // Apabila objek def dilaksanakan, panggilan balik yang sepadan ialah def.progress().

Langkah seterusnya ialah menetapkan kaedah panggil balik Susunan yang sepadan dengan yang di atas, iaitu panggilan balik yang akan dipanggil dalam keadaan apa

Salin kod Kod adalah seperti berikut:

def.done(); // Sepadan dengan def.resolve();
def.fail(); // Sepadan dengan def.reject();
def.progress(); // Sepadan dengan def.notify();
// Istimewa
def.always(); // Akan dipanggil untuk berjaya atau gagal
def.then(); // Terima pelbagai fungsi, supaya ia berjaya (selesai), kegagalan (gagal) dan kemajuan (kemajuan)

Malah, pada ketika ini, penggunaan objek tertunda adalah hampir sama. Walau bagaimanapun, jQuery juga menyediakan beberapa API

Salin kod Kod adalah seperti berikut:

// Semak kelas status semasa
def.isRejected();
def.isResolved();
def.state();

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

Salin kod Kod adalah seperti berikut:

def.promise();

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.

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