javascript - Memahami promises dalam Node.js
Dari yang saya pahami, ada tiga cara untuk memanggil kode asinkron:
- Acara, misalnya
request.on("event", callback); - Callback, misalnya
fs.open(path, flags, mode, callback); - Janji
Saya menemukan pustaka node-promise tetapi saya tidak memahaminya.
Bisakah seseorang menjelaskan apa itu promise dan mengapa saya harus menggunakannya?
Juga, mengapa itu dihapus dari Node.js?
Jawaban #1
Karena pertanyaan ini masih memiliki banyak tampilan (seperti milik saya), saya ingin menunjukkan bahwa:
- node-promise tampaknya sudah mati bagi saya (commit terakhir sekitar 1 tahun yang lalu) dan hampir tidak memiliki tes.
- Modul futures terlihat sangat membengkak bagi saya dan dokumentasinya buruk (dan saya pikir konvensi penamaan itu memang buruk)
- Cara terbaik untuk pergi tampaknya adalah kerangka kerja q, yang aktif dan terdokumentasi dengan baik.
Jawaban #2
Janji (promises) di node.js menjanjikan untuk melakukan beberapa pekerjaan dan kemudian memiliki callback terpisah yang akan dijalankan untuk keberhasilan dan kegagalan serta menangani batas waktu. Cara lain untuk memikirkan janji di node.js adalah bahwa mereka adalah pemancar (emitters) yang hanya dapat memancarkan dua peristiwa: sukses dan error.
Hal keren tentang janji adalah kamu bisa menggabungkannya menjadi rantai ketergantungan (lakukan Janji C hanya ketika Janji A dan Janji B selesai).
Dengan menghapusnya dari core node.js, itu menciptakan kemungkinan untuk membangun modul dengan implementasi promises yang berbeda yang dapat ditempatkan di atas core. Beberapa di antaranya adalah node-promise dan futures.
Jawaban #3
Janji adalah sebuah "benda" yang mewakili hasil "akhir" dari suatu operasi, begitu kata pepatah. Hal yang perlu dicatat di sini adalah, janji ini menyamarkan rincian tentang kapan sesuatu terjadi dan memungkinkan Anda untuk fokus pada apa yang seharusnya terjadi setelah sesuatu itu terjadi. Hal ini akan menghasilkan kode yang bersih dan mudah dipelihara di mana alih-alih memiliki callback di dalam callback di dalam callback, kode Anda akan terlihat seperti:
var request = new Promise(function(resolve, reject) {
//do an ajax call here. or a database request or whatever.
//depending on its results, either call resolve(value) or reject(error)
//where value is the thing which the operation's successful execution returns and
//error is the thing which the operation's failure returns.
});
request.then(function successHandler(result) {
//do something with the result
}, function failureHandler(error) {
//handle
});
Spesifikasi janji menyatakan bahwa sebuah janji
then
metode harus mengembalikan janji baru yang dipenuhi ketika successHandler atau callback failureHandler yang diberikan selesai. Ini berarti bahwa Anda dapat menggabungkan janji ketika Anda memiliki serangkaian tugas asinkron yang perlu dilakukan dan yakin bahwa urutan operasinya dijamin seperti halnya jika Anda menggunakan callback. Jadi alih-alih melewatkan callback di dalam callback di dalam callback, kode dengan janji berantai terlihat seperti:
var doStuff = firstAsyncFunction(url) {
return new Promise(function(resolve, reject) {
$.ajax({
url: url,
success: function(data) {
resolve(data);
},
error: function(err) {
reject(err);
}
});
};
doStuff
.then(secondAsyncFunction) //returns a promise
.then(thirdAsyncFunction); //returns a promise
Untuk mengetahui lebih banyak tentang janji dan mengapa mereka sangat keren, lihat blog Domenic: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/
Jawaban #4
Tutorial baru tentang Promises ini dari penulis PouchDB mungkin yang terbaik yang pernah saya lihat di mana pun. Tutorial ini dengan bijak membahas kesalahan pemula klasik dengan menunjukkan pola penggunaan yang benar dan bahkan beberapa anti-pola yang masih umum digunakan - bahkan dalam tutorial lain!!
- http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
Selamat menikmati!
PS Saya tidak menjawab beberapa bagian lain dari pertanyaan ini karena telah dibahas dengan baik oleh orang lain.
