Pecahkan bahwa fungsi callback terlalu dalam, dan logika paralel harus dieksekusi secara serial. Janji mewakili hasil akhir dari operasi asinkron. Cara utama untuk berinteraksi dengan janji adalah dengan mendaftarkan fungsi panggilan balik melalui metode kemudian () untuk menerima nilai hasil akhir dari janji.
Protokol terkait janji termasuk Promisea dan Promisea+
Tentukan janji kelas
Tentukan antrian atribut antrian, inisialisasi array kosong []
Tentukan nilai nilai properti, inisialisasi nol
Tentukan status status properti dan inisialisasi "tertunda" (nilai default)
Tentukan metode anggota getqueue (), return atribute antribut
Tentukan metode anggota getStatus (), kembalikan status atribut
Tentukan metode anggota setstatus (), set status, parameter lulus: status, nilai
Tentukan bahwa status terpenuhi atau ditolak,
Tetapkan Properti Status This.Status = Status
Atur properti nilai this.value = nilai || null, jika Anda tidak memberikan nilainya, itu nol
Tentukan FreezeObject variabel beku
Definisikan metode anggota iSfulFilled () untuk menentukan apakah keadaan saat ini (selesai)
Tentukan metode anggota isrejected () untuk menentukan apakah keadaan saat ini (gagal)
Tentukan metode anggota ispending (), tentukan master status saat ini (menunggu)
Tentukan metode anggota kemudian (), Parameter Pass: Callback Sukses Onfulfilled, OnReChjected Failure Callback
Tentukan dua fungsi panggilan balik: objek handler, atribut terpenuhi, ditolak
Tentukan properti yang ditangguhkan dari objek pawang, objek yang ditangguhkan
Tentukan apakah keadaan saat ini sedang menunggu. Jika menunggu, masukkan objek pawang ke dalam array antrian antrian
Jika ini bukan keadaan menunggu, hubungi metode prosedur () dari objek utils, parameter: status,
Return handler.deferred.promise objek
Tentukan kelas yang ditangguhkan
Tentukan janji atribut dan inisialisasi objek janji
Tentukan metode anggota resolve (), lulus parameter: hasil hasil
Tentukan status objek janji sebagai menunggu dan kembali secara langsung
Panggil metode getqueue () dari objek janji untuk mendapatkan array antrian
Array loop
// TODO PANGGILAN Kelas alat util. Metode Prosedur (), Parameter: "Dipenuhi", elemen, informasi err
Panggil metode setstatus () dari objek janji, atur status, parameter: 'terpenuhi', hasil
Tentukan metode anggota Tolak, Parameter Pass: pesan kesalahan err
Tentukan status objek janji sebagai menunggu dan kembali secara langsung
Panggil metode getqueue () dari objek janji untuk mendapatkan array antrian
Array loop
// TODO, hubungi util kelas alat. Metode Prosedur (), Parameter: "Ditolak", Elemen, Informasi Err
Panggil metode setstatus () dari objek janji, atur status, parameter: 'terpenuhi', hasil
Tentukan util kelas alat, jalankan segera menggunakan fungsi anonim, dan dapatkan objek
Mengembalikan objek, ada prosedur metode () di objek
Tentukan metode Prosedur (), Parameter Pass: Jenis Tipe Negara, Array Prosesor Penangan, Hasil Hasil
Dapatkan fungsi fungsi pemrosesan, di handler [ketik]
Saya pusing ketika saya tiba di sini. . .
Bagaimana menggunakan:
Tentukan fungsi AJAX, lulus parameter: Jalur URL
Dapatkan objek yang ditangguhkan dan keluar baru
Kode AJAX untuk meminta data, dalam metode panggilan balik yang mengembalikan data
Jika metode Resolve () dari objek yang ditangguhkan berhasil dipanggil, parameter: pengembalian data
Jika metode tolak () dari objek yang ditangguhkan disebut gagal, parameter: data yang dikembalikan
Mengembalikan objek yang ditangguhkan
Hubungi metode ajax () untuk mendapatkan objek janji, parameter: url,
Panggil metode kemudian () dari objek janji, parameter: fungsi anonim
Hubungi metode ajax () untuk mendapatkan objek janji dan mengembalikan objek ini
Membentuk panggilan rantai
Bagian JS:
<script> // bagian kode janji (saya memilih sabuk anjing) janji = fungsi () {this.queue = []; this.value = null; this.status = 'tertunda'; // tertunda dipenuhi ditolak}; janji.prototype.getQueue = function () {return this.queue;}; janji.prototype.getStatus = function () {return this.status;}; janji s = i {i oMFROTIPE.OpROTIPE.OSED.OY= (s, nilai) {if== (s, value (s, value (s, value) {api ') {if== this.status = s; this.value = value || batal; this.queue = []; var freezeObject = Object.freeze || fungsi(){}; freezeObject (this); // State of Promise tidak dapat diubah} else {throw new error ({pesan: "tidak mendukung status:" + s}); }}; Janji.prototype.isfulfilled = function () {return this.status === 'terpenuhi';}; janji.prototype.isrejected = function () {return this.status === 'ditolak';} promise.prototype.ispending = function () {return this.status ==; function (onfulfilled, onrejected) {var handler = {'terpenuhi': onfulfilled, 'ditolak': onrejected}; Handler.Deferred = baru ditangguhkan (); if (! this.ispending ()) {// Ini diizinkan untuk mengubah status janji terlebih dahulu dan kemudian menambahkan callbacks utils.procedure (this.status, handler, this.value); } else { this.queue.push(handler);//then may be called multiple times on the same promise;Specification 2.2.6 } return handler.deferred.promise;//then must return a promise;Specification 2.2.7};var utils = (function(){ var makeSignaler = function(deferred, type) { return function(result) { transition(deferred, type, result); } }; var procedure = Fungsi (Handler, Hasil) {Var Func = Handler [Type]; newResult.then (function (data) {// def.resolve (data); //}, function (err) {// def.reject (err); //}); // Jika X dipenuhi, memenuhi janji dengan nilai yang sama. transisi, 'ditolak', err); Error ({'pesan': "tidak mendukung tipe:" + type});}}; } var queue = this.promise.getQueue (); untuk (var i = 0, len = queue.length; i <len; i ++) {utils.procedure ('terpenuhi', antrian [i], hasil); } this.promise.setStatus ('terpenuhi', hasil);}; Deferred.prototype.Rect = function (err) {if (! this.promise.ispending ()) {return; } var queue = this.promise.getQueue (); untuk (var i = 0, len = queue.length; i <len; i ++) {utils.procedure ('ditolak', antrian [i], err); } this.promise.setStatus ('ditolak', err);}/******************************************************************************Test Part Ajax = Fungsi (URL) {var def = New Deferred (); var xhr = xmlhttpRequest baru (); xhr.onreadystatechange = function () {if (xhr.readystate === 4) {if ((xhr.status> = 200 && xhr.status <300) || xhr.status === 304) {def.Resolve (xhr.responsetext)} noBLOCK LHOLE {noBLOX LHOLE {noBLOX LYLE {noxoly/noBLOXE (xhr.responsetext) Error ({pesan: xhr.status})); }}}}}; xhr.open ('get', url, true); xhr.send (null); return def.promise;} ajax ('test.php? Act = 1'). Kemudian (function (data1) {console.log (data1); // menangani data1 return ajax ('test.php? Act = 2');}). Lalu (function (data2) {console.log (data2); ////function (function (data2) {console.log (data2); ////function return (function (data2) {console.log. {console.error (err);}). Kemudian (function (data3) {console.log (data3); waspada ('sukses');}, function (err) {console.error (err);}); </skrip>PHP:
<? phpif ($ _ get ['act'] == 1) {echo json_encode (array ("code" => 200));} lain jika ($ _ get ['act'] == 2) {echo json_encode (array ("code" => 300));} lain jika ($ _ get [') ("code" => 300)); json_encode (array ("kode" => 400));}Ringkasan di atas dari pembelajaran sederhana dan penggunaan JavaScript Promise adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.