Saat menggunakan jQuery, saya tahu bahwa janji adalah mode mode pemrograman JS asinkron, tetapi saya tidak mengerti perbedaan antara itu dan objek yang ditangguhkan JQuery. Saat proyek perusahaan berlangsung, kami harus menerima data dari backend, jadi kami memutuskan untuk menyelesaikannya.
Janji
Promise adalah mode yang mengoperasikan peristiwa asinkron dalam bentuk operasi sinkron, menghindari lapisan demi lapisan bersarang, dan dapat mengoperasikan peristiwa asinkron dalam rantai.
Kita tahu bahwa ketika menulis kode asinkron JavaScript, panggilan balik adalah mekanisme termudah, tetapi jika Anda menggunakan mekanisme ini, Anda harus mengorbankan aliran kontrol, penanganan pengecualian dan semantik fungsi, dan bahkan membiarkan kami jatuh ke dalam lubang callback, dan janji menyelesaikan masalah ini.
Dalam ES6, q built-in angularjs built-in q in promise, angularjs, dan ketika mereka menggunakan spesifikasi janji/A, sebagai berikut:
Setiap tugas memiliki tiga negara bagian: tertunda, terpenuhi, dan gagal.
1. Negara Peluang: Anda dapat beralih ke status pemenuhan atau penolakan.
2. Keadaan yang dipenuhi: tidak dapat diubah ke negara bagian lain, dan negara tidak dapat diubah, dan harus ada nilai nilai.
3. Negara yang Diproyeksikan: Itu tidak dapat diubah ke negara bagian lain, dan negara tidak dapat diubah, harus ada alasannya.
Transfer negara adalah satu kali. Setelah negara dipenuhi (selesai) atau gagal (gagal/ditolak), itu tidak dapat berubah lagi.
Salinan kode adalah sebagai berikut:
fungsi oktogreet (name) {
return name === 'Robin Hood';
}
fungsi asyncgreet (name) {
var ditangguhkan = $ q.defer ();
setTimeout (function () {
// Karena fungsi asinkron ini, FN dieksekusi di masa depan secara asinkron, kami membungkus kode ke dalam panggilan $ Apply, sementara mengamati perubahan dalam model dengan benar
$ scope. $ apply (function () {
Deferred.notify ('akan menyapa' + name + '.');
if (oktogreet (name)) {
Deferred.Resolve ('Hello,' + Name + '!');
} kalau tidak {
ditangguhkan.
}
});
}, 1000);
return ditangguhkan.promise;
}
var janji = asyncgreet ('robin hood');
janji.then (function (ucapan) {
alert ('Success:' + Salam);
}, function (reason) {
peringatan ('Gagal:' + alasan);
}, function (update) {
Peringatan ('Got Notification:' + Update);
});
Penggunaan Dasar Q Janji
Kode di atas menunjukkan peran beberapa metode instance deffered yang dibangun oleh $ q.defer (). Jika operasi asinkron berhasil, keadaan objek janji diubah menjadi "kesuksesan" (mis., Dari tertunda hingga diselesaikan); Jika operasi asinkron gagal, negara diubah menjadi "gagal" (mis., Dari yang tertunda menjadi ditolak). Akhirnya, return ditangguhkan.promise dan kami dapat menghubungkan metode kemudian.
JS akan memiliki janji asli, sudah ada objek janji di ES6, dan API janji dasar diimplementasikan dalam versi beta Firefox dan Chrome 32.
$ Q.Defferd di AngularJS
Kembalikan objek deffered untuk disebut dirantai dengan menelepon $ q.defferd. Objek ini mengaitkan tiga status tugas dalam spesifikasi janji/A melalui API.
API Deffered
Metode objek deffered
1. resolusi (nilai): Pada deklarasi tekad (), ini menunjukkan bahwa objek janji berubah dari keadaan yang tertunda untuk diselesaikan.
2.RECK (Alasan): Pada Deklarasi Resolve (), ini menunjukkan bahwa objek janji berubah dari negara yang tertunda menjadi ditolak.
3. Beri tahu (nilai): Pada deklarasi memberi tahu (), ini menunjukkan bahwa keadaan yang tidak terpenuhi dari objek janji dapat dipanggil beberapa kali sebelum menyelesaikan atau menolak.
Properti Objek Deffered
Janji: Hal terakhir yang mengembalikan adalah properti janji objek yang ditangguhkan baru, bukan objek yang ditangguhkan asli. Objek janji baru ini hanya dapat mengamati status objek janji asli, dan tidak dapat memodifikasi keadaan internal objek yang ditangguhkan, yang dapat mencegah keadaan tugas dari dimodifikasi secara eksternal.
Janji API
Saat membuat instance yang ditangguhkan, objek janji baru dibuat dan referensi dapat diperoleh melalui ditangguhkan.promise.
Tujuan dari objek Promise adalah untuk memungkinkan bagian yang tertarik untuk mendapatkan hasil eksekusi ketika tugas yang ditangguhkan selesai.
Metode objek janji
1.then (errorhandler, dipenuhi oleh Handler, ProgressHandler): Metode kemudian digunakan untuk mendengarkan berbagai keadaan janji. ERRORHANDLER Mendengarkan Keadaan Gagal, Penyelidikan Dipenuhi Mendengarkan Keadaan Terpenuhi, dan ProgressHandler mendengarkan keadaan yang tidak terpenuhi. Selain itu, panggilan balik notify dapat dipanggil 0 hingga beberapa kali, memberikan indikasi kemajuan sebelum menyelesaikan atau menolak (menyelesaikan dan menolak).
2.Catch (errorCallback) - Shortcut to Promise.then (null, errorCallback)
3. Akhirnya (Callback) - Memungkinkan Anda untuk mengamati apakah janji dieksekusi atau ditolak, tetapi Anda tidak perlu memodifikasi nilai terakhir. Ini dapat digunakan untuk membebaskan sumber daya atau membersihkan objek yang tidak berguna, terlepas dari apakah janji itu ditolak atau diselesaikan. Untuk informasi lebih lanjut, silakan merujuk ke spesifikasi dokumentasi lengkap.
Panggilan rantai janji dapat diimplementasikan melalui metode kemudian ().
Salinan kode adalah sebagai berikut:
janjib = promisea.then (function (hasil) {
hasil pengembalian + 1;
});
// Promisb akan diproses segera setelah memproses promisea,
// dan nilai nilainya adalah hasil dari promisea meningkat sebesar 1
Metode lain $ q
$ q.when (nilai): Lewati nilai variabel, janji.then () menjalankan panggilan balik yang berhasil
$ q.all (janji): Beberapa janji harus dieksekusi dengan sukses sebelum mereka dapat dieksekusi dengan sukses. Nilai dilewatkan sebagai nilai array atau hash. Setiap nilai dalam array adalah objek janji yang sesuai dengan indeks.