Saya memahami ide panggilan balik, di mana saya meneruskan fungsi ke fungsi lain dan fungsi itu kemudian menggunakan fungsi yang disediakan sesuka hati.
Saya kesulitan memahami panggilan balik yang ditunda, bahkan setelah googling.
Bisakah seseorang memberikan penjelasan sederhana? Saya memprogram di Ruby, tetapi juga tahu C / C ++ sedikit, tetapi yang terpenting saya adalah programmer bahasa assembly yang berpengalaman. Jadi saya bertanya-tanya apakah ini sedikit seperti tumpukan alamat panggilan balik yang muncul? Saya berharap untuk belajar jquery atau node.js dan panggilan balik yang ditangguhkan ini tampaknya integral untuk keduanya. Saya mengerti prinsip dasar threading (meskipun objek mutex membuat kepala saya sakit;)
Deferred
? Apakah ini tentang sesuatu yang spesifik untuk Node.js?Jawaban:
Atas permintaan, berikut adalah komentar yang disajikan sebagai jawaban:
Saya tidak yakin Anda benar-benar memahami fakta bahwa fungsi di JS adalah objek kelas satu, dan karenanya dapat disimpan sampai dibutuhkan, melewati waktu mereka dibuat.
Misalnya, Anda ingin menulis ke file, lalu cetak pesan log; jadi Anda memanggil fungsi "write ()" (atau apa pun) dan meneruskannya fungsi yang menampilkan pesan log (ini adalah fungsi callback yang ditangguhkan). "write ()" secara internal menyimpan referensi ke fungsi yang diberikan, mulai menulis ke file, dan mengatur panggilan baliknya sendiri untuk mengetahui kapan penulisan selesai. Kemudian kembali sebelum penulisan dilakukan; ketika itu, panggilan balik internal entah bagaimana disebut (ini adalah pekerjaan kerangka kerja yang mendasarinya - dalam kasus node.js, itu dilakukan dengan loop peristiwa), yang kemudian memanggil panggilan balik Anda yang mencetak pesan log.
Bagian "ditangguhkan" berarti bahwa fungsi panggilan balik Anda tidak langsung dipanggil; panggilan itu ditangguhkan sampai waktu yang tepat. Dalam kasus fungsi asinkron seperti banyak yang ada di node.js, panggilan balik yang diberikan umumnya dipanggil saat operasi selesai (atau terjadi kesalahan).
Sebagian besar barang async di node.js, tetapi di browser dengan misal jQuery, sebagian besar barang sebenarnya sinkron (kecuali, jelas, untuk permintaan AJAX). Karena fungsi kelas satu sangat berguna dalam JavaScript (terutama karena dukungan penutupan yang hebat), panggilan balik juga digunakan di mana-mana di browser, tetapi mereka tidak "ditangguhkan" untuk operasi sinkron (kecuali sejauh mereka tidak dipanggil segera oleh Anda, tetapi nanti dengan fungsi yang Anda panggil).
Fakta bahwa sistem yang mendasarinya adalah event-driven adalah ortogonal untuk penggunaan panggilan balik ditangguhkan; Anda dapat membayangkan versi node.js (sangat lambat) yang memulai utas untuk setiap operasi, dan kemudian memanggil panggilan balik yang diberikan saat utas selesai bekerja, tanpa menggunakan acara sama sekali. Tentu saja, ini adalah model yang mengerikan, tetapi menggambarkan maksud saya :-)
sumber
Cara panggilan balik ditunda berfungsi adalah setiap kali Anda menambahkan panggilan balik ke dalamnya, panggilan balik itu didorong ke sebuah array. Kemudian, ketika metode
.resolve()
atau.resolveWith()
dipanggil pada objek yang ditangguhkan, semua.done()
panggilan balik dalam array dieksekusi secara berurutan.Sekarang kita bisa melihat apa Objek Ditangguhkan itu. Ambil cuplikan di bawah ini sebagai contoh.
Apa yang kita miliki sekarang adalah objek yang ditangguhkan, dan objek janji objek yang ditangguhkan. Objek ditangguhkan memiliki semua metode yang sama sebagai objek janji, namun objek janji hanya memiliki metode
.done()
,.fail()
dan.always()
yang digunakan untuk menambahkan callback ke objek ditangguhkan untuk setiap masing-masingevent
. Objek yang ditangguhkan di sisi lain memiliki beberapa metode lain, yang paling penting.resolve()
dan.reject()
. Ketika metode ini dipanggil pada objek yang ditangguhkan, semua panggilan balik dipanggil..resolve()
memecat.done()
dan memanggil.always()
kembali sementara.reject()
metode panggilan.fail()
dan panggilan.always()
balik.Umumnya objek yang ditangguhkan disimpan tersembunyi dalam ruang lingkup pribadi, dan objek janji dikembalikan dari fungsi sehingga callback dapat ditempatkan di atasnya. Objek yang ditangguhkan akan diselesaikan nanti, seperti setelah permintaan ajax selesai atau setelah gambar dimuat, setelah setTimeout, dll. Juga penting untuk menyadari bahwa objek yang ditangguhkan hanya dapat diselesaikan satu kali. Jika sudah diselesaikan, panggilan balik itu akan segera dipanggil.
Inilah contoh lain, yang saya gunakan:
Untuk informasi lebih lanjut tentang
$.Deferred()
metode jQuery dan objek yang ditangguhkan, kunjungi http://api.jquery.com/category/deferred-object/sumber
Saya tidak yakin, tetapi saya percaya panggilan balik yang tertunda mengacu pada panggilan balik yang tidak sinkron, jadi Anda akan lebih beruntung di google untuk itu.
Penjelasan terbaik yang saya temukan adalah di http://www.nodebeginner.org
Dalam contoh ini, mungkinExpensiveFunction adalah fungsi non-blocking (atau async). Ini berarti bahwa itu tidak dieksekusi segera, tetapi ditempatkan dalam suatu peristiwa yang disebut loop. Thread node.js akan melanjutkan eksekusi, tetapi pada titik tertentu, ia akan memutuskan untuk mengeksekusi sesuatu dari loop peristiwa. Ketika mencapai mungkinExpensiveFunction, ia memanggilnya, dan ketika mungkinExpensiveFunction menyelesaikan eksekusi, ia memanggil callback (ditangguhkan) yang dilewatkan sebagai parameter untuk itu.
Sebagai contoh dari mungkinExpensiveFunction, Anda dapat mengambil fs.readFile
sumber
.resolve()
atau.reject()
pada objek yang ditangguhkan asli, daftar panggilan balik dipanggil.JavaScript adalah utas tunggal, jadi Anda tidak dapat berpikir dalam hal utas untuk memahami ini. Berikut adalah contoh dari callback biasa dan tidak sinkron menggunakan jQuery:
sumber
Callback ditangguhkan (alias Janji ) memungkinkan Anda untuk menulis kode asinkron berurutan, tanpa rasa sakit dan spageti callback:
'kapan' memungkinkan Anda menunggu fungsi kembali secara paralel, dan
then
dapat dirantai secara berurutan.satu catatan: jQuery ditangguhkan ! = Janji / A , sintaks mereka sedikit berbeda.
Ada artikel bagus tentang topik: satu di IEBlog dan lainnya di beberapa blog acak , buku, dan pertanyaan tentang stackoverflow yang populer
sumber