Mode pemrograman janji juga disebut Thenable, yang dapat dipahami sebagai eksekusi setelah penundaan. Setiap janji memiliki antarmuka unik yang disebut, dan ketika janji gagal atau berhasil, itu akan melakukan panggilan balik. Ini mewakili hasil operasi yang mungkin berjalan untuk waktu yang lama dan tidak harus diselesaikan. Pola ini tidak memblokir dan menunggu operasi jangka panjang untuk diselesaikan, tetapi mengembalikan objek yang mewakili hasil yang dijanjikan.
Banyak perpustakaan JavaScript saat ini (seperti jQuery dan dojo, AngularJS) menambahkan abstraksi yang disebut janji ini. Melalui perpustakaan ini, pengembang dapat menggunakan mode janji dalam pemrograman aktual.
Di bawah ini kami akan menggunakan jQuery sebagai contoh untuk membahas bagaimana pustaka JavaScript menggunakan mode Promise untuk menangani pemrosesan asinkron, yang sebenarnya untuk memberikan dukungan toleran kesalahan melalui callbacks. Ketika suatu operasi berhasil atau gagal atau dalam hal apa pun, panggilan balik yang sesuai dieksekusi, dan mencoba menangani situasi yang mungkin dalam sepotong logika tertentu.
Pertama, mari kita lihat bagaimana jQuery umumnya beroperasi:
Salinan kode adalah sebagai berikut:
var $ info = $ ("#info");
$ .Ajax ({
URL: "/echo/json/",
Data: {json: json.stringify ({"name": "somevalue"})},
Ketik: "Posting",
Sukses: Fungsi (Respons)
{
$ info.text (response.name);
}
});
Dalam contoh ini, Anda dapat melihat bahwa ketika pengaturan berhasil, panggilan balik akan ditentukan, yang merupakan metode panggilan balik yang baik. Ini bukan janji, dan dokumentasi resmi JQuery tidak lagi merekomendasikan metode ini (http://api.jquery.com/jquery.ajax/#jqxhr). Ketika panggilan AJAX selesai, ia menjalankan fungsi keberhasilan. Bergantung pada operasi asinkron yang digunakan oleh perpustakaan, Anda dapat menggunakan berbagai panggilan balik yang berbeda (mis., Apakah tugas itu berhasil atau tidak, itu akan dipanggil kembali dan merespons). Menggunakan mode Promise menyederhanakan proses ini, operasi asinkron hanya perlu mengembalikan panggilan objek. Janji ini memungkinkan Anda untuk memanggil metode yang dipanggil kemudian dan kemudian memungkinkan Anda menentukan jumlah fungsi callback.
Mari kita lihat bagaimana jQuery membangun janji:
Salinan kode adalah sebagai berikut:
var $ info = $ ("#info");
$ .Ajax ({
URL: "/echo/json/",
Data: {
json: json.stringify ({
"Nama": "SomeValue"
})
},
Jenis: "Posting"
})
.then (function (response) {
$ info.text (response.name);
});
Objek Ajax JQuery mengimplementasikan mode janji dengan mengembalikan objek XHR, sehingga kita dapat memanggil metode kemudian. Keuntungan melakukan ini adalah bahwa Anda dapat rantai panggilan dan mengimplementasikan operasi independen, seperti yang ditunjukkan di bawah ini:
Salinan kode adalah sebagai berikut:
var $ info = $ ("#info");
$ .Ajax ({
URL: "/echo/json/",
Data: {
json: json.stringify ({
"Nama": "SomeValue"
})
},
Jenis: "Posting"
})
.then (function (response) {
$ info.text (response.name);
})
.then (function () {
$ info.append ("... selengkapnya");
})
.done (function () {
$ info.pappend ("... akhirnya!");
});
Operasi asinkron menjadi sangat mudah karena banyak perpustakaan mulai menggunakan mode janji. Tetapi jika Anda berpikir dari perspektif yang berlawanan, seperti apa janji? Salah satu pola yang sangat penting adalah bahwa fungsi tersebut dapat menerima dua fungsi, satu adalah panggilan balik ketika berhasil, dan yang lainnya adalah panggilan balik saat gagal.
Salinan kode adalah sebagai berikut:
var $ info = $ ("#info");
$ .Ajax ({
// Ubah URL untuk melihat kesalahan terjadi
URL: "/echo/json/",
Data: {
json: json.stringify ({
"Nama": "SomeValue"
})
},
Jenis: "Posting"
})
.then (function (response) {
// kesuksesan
$ info.text (response.name);
},
fungsi () {
// kegagalan
$ info.text ("Hal -hal buruk terjadi pada pengembang yang baik");
})
.always (function () {
$ info.append ("... akhirnya");
});
Perlu dicatat bahwa dalam jQuery, apakah berhasil atau gagal, kami akan menggunakan panggilan untuk menentukan apa yang ingin kami panggil.
Bahkan, Anda juga dapat menulis ini di sini, yang juga merupakan metode yang disarankan dalam dokumen resmi JQuery:
Salinan kode adalah sebagai berikut:
var $ info = $ ("#info");
$ .Ajax ({
// Ubah URL untuk melihat kesalahan terjadi
URL: "/echo/json/",
Data: {
json: json.stringify ({
"Nama": "SomeValue"
})
},
Jenis: "Posting"
})
.done (function (response) {
// kesuksesan
$ info.text (response.name);
}). fail (function () {
// kegagalan
$ info.text ("Hal -hal buruk terjadi pada pengembang yang baik");
})
.always (function () {
$ info.append ("... akhirnya");
});
Mari kita lihat bagaimana AngularJS menggunakan mode janji:
Salinan kode adalah sebagai berikut:
var m = angular.module ("myapp", []);
M.Factory ("DataService", Function ($ Q) {
fungsi _callme () {
var d = $ q.defer ();
setTimeout (function () {
d.resolve ();
//defer.REJECT ();
}, 100);
mengembalikan D. Promise;
}
kembali {
CallMe: _callme
};
});
fungsi myctrl ($ scope, dataservice) {
$ scope.name = "none";
$ scope.isbusy = true;
DataService.callme ()
.then (function () {
// berhasil
$ scope.name = "sukses";
},
fungsi () {
// kegagalan
$ scope.name = "kegagalan";
})
.then (function () {
// seperti klausa akhirnya
$ scope.isbusy = false;
});
}
Anda dapat mencoba contoh -contoh ini di jsfiddle dan melihat efek apa yang akan dihasilkan. Menggunakan janji untuk beroperasi asinkron adalah cara yang sangat sederhana, dan juga dapat menyederhanakan kode Anda. Ini memang cara yang baik untuk membunuh dua burung dengan satu batu.
Untuk perkenalan dan contoh lebih lanjut tentang janji, Anda dapat pergi ke situs web resmi (http://www.promisej.org/).