Bagaimana cara menjelaskan panggilan balik dalam Bahasa Inggris? Bagaimana mereka berbeda dari memanggil satu fungsi dari fungsi lain mengambil beberapa konteks dari fungsi panggilan? Bagaimana kekuatan mereka dapat dijelaskan kepada programmer pemula?
function
callback
language-agnostic
terminology
Yahoo-Me
sumber
sumber
Jawaban:
Seringkali aplikasi perlu menjalankan fungsi yang berbeda berdasarkan konteks / kondisinya. Untuk ini, kami menggunakan variabel tempat kami akan menyimpan informasi tentang fungsi yang akan dipanggil. Sesuai dengan kebutuhannya aplikasi akan mengatur variabel ini dengan informasi tentang fungsi yang akan dipanggil dan akan memanggil fungsi menggunakan variabel yang sama.
Dalam javascript, contohnya di bawah ini. Di sini kita menggunakan argumen metode sebagai variabel tempat kita menyimpan informasi tentang fungsi.
sumber
function(arg)
) dalamprocessArray(arr,callback)
fungsiSaya akan mencoba untuk membuat ini tetap sederhana. "Callback" adalah fungsi apa pun yang dipanggil oleh fungsi lain yang menggunakan fungsi pertama sebagai parameter. Sering kali, "panggilan balik" adalah fungsi yang dipanggil ketika sesuatu terjadi. Itu sesuatu yang dapat disebut "event" di programmer-berbicara.
Bayangkan skenario ini: Anda mengharapkan paket dalam beberapa hari. Paket ini adalah hadiah untuk tetangga Anda. Karena itu, begitu Anda mendapatkan paket, Anda ingin membawanya ke tetangga. Anda berada di luar kota, dan karenanya Anda meninggalkan instruksi untuk pasangan Anda.
Anda bisa memberi tahu mereka untuk mendapatkan paket dan membawanya ke tetangga. Jika pasangan Anda sebodoh komputer, mereka akan duduk di pintu dan menunggu paket sampai tiba (TIDAK MELAKUKAN APA SAJA LAIN) dan kemudian setelah datang mereka akan membawanya ke tetangga. Tapi ada cara yang lebih baik. Beri tahu pasangan Anda bahwa SEKALI mereka menerima paket itu, mereka harus membawanya ke tetangga. Kemudian, mereka bisa menjalani kehidupan secara normal SAMPAI mereka menerima paket.
Dalam contoh kami, penerimaan paket adalah "acara" dan membawanya ke tetangga adalah "panggilan balik". Pasangan Anda "menjalankan" instruksi Anda untuk membawa paket hanya ketika paket tiba. Jauh lebih baik!
Pemikiran seperti ini jelas dalam kehidupan sehari-hari, tetapi komputer tidak memiliki akal sehat yang sama. Pertimbangkan bagaimana programmer biasanya menulis ke file:
Di sini, kami MENUNGGU file dibuka, sebelum kami menulisnya. Ini "menghalangi" aliran eksekusi, dan program kami tidak dapat melakukan hal-hal lain yang mungkin perlu dilakukan! Bagaimana jika kita bisa melakukan ini sebagai gantinya:
Ternyata kami melakukan ini dengan beberapa bahasa dan kerangka kerja. Itu sangat keren! Lihatlah Node.js untuk mendapatkan latihan nyata dengan pemikiran seperti ini.
sumber
open
kerjanya. Masuk akal bahwaopen
bisa memblokir secara internal sambil menunggu OS untuk melakukan sihir hitamnya, di mana callback dieksekusi. Tidak ada perbedaan hasil dalam kasus seperti itu.Dalam bahasa Inggris yang sederhana, fungsi panggilan balik adalah seperti Pekerja yang "memanggil kembali" ke Manajernya ketika ia telah menyelesaikan Tugas .
Memang benar bahwa Anda memanggil fungsi dari fungsi lain, tetapi kuncinya adalah bahwa panggilan balik diperlakukan seperti Obyek, sehingga Anda dapat mengubah Fungsi yang akan dipanggil berdasarkan kondisi sistem (seperti Pola Desain Strategi).
Kekuatan panggilan balik dapat dengan mudah dilihat di situs web gaya AJAX yang perlu menarik data dari server. Mengunduh data baru mungkin perlu waktu. Tanpa panggilan balik, seluruh Antarmuka Pengguna Anda akan "macet" saat mengunduh data baru, atau Anda perlu menyegarkan seluruh halaman daripada hanya bagian dari itu. Dengan panggilan balik, Anda dapat menyisipkan gambar "memuat sekarang" dan menggantinya dengan data baru setelah dimuat.
Beberapa kode tanpa panggilan balik:
Dengan Callback:
Berikut adalah contoh dengan panggilan balik, menggunakan getJSON 's jQuery :
Dengan Penutupan:
Seringkali panggilan balik perlu diakses
state
dari fungsi panggilan menggunakan aclosure
, yang seperti Pekerja perlu mendapatkan informasi dari Manajer sebelum dia dapat menyelesaikan Tugasnya . Untuk membuatclosure
, Anda bisa sebaris fungsi sehingga melihat data dalam konteks panggilan:Pemakaian:
Penutupan
Akhirnya, berikut adalah definisi
closure
dari Douglas Crockford :Fungsi dapat didefinisikan di dalam fungsi lain. Fungsi dalam memiliki akses ke vars dan parameter fungsi luar. Jika referensi ke fungsi dalam bertahan (misalnya, sebagai fungsi callback), vars fungsi luar juga bertahan.
Lihat juga:
sumber
Saya terpana melihat begitu banyak orang pintar gagal menekankan kenyataan bahwa kata "panggilan balik" telah digunakan dalam dua cara yang tidak konsisten.
Kedua cara melibatkan kustomisasi fungsi dengan melewatkan fungsi tambahan (definisi fungsi, anonim atau bernama) ke fungsi yang ada. yaitu.
Jika fungsionalitas khusus dicolokkan ke blok kode, Anda telah menyesuaikan fungsinya, seperti itu.
Meskipun jenis fungsi yang disuntikkan ini sering disebut "panggilan balik", tidak ada yang bergantung pada itu. Contoh yang sangat jelas adalah metode forEach di mana fungsi kustom disediakan sebagai argumen untuk diterapkan ke setiap elemen dalam array untuk memodifikasi array.
Tapi ini pada dasarnya berbeda dari penggunaan fungsi "callback" untuk pemrograman asinkron , seperti dalam AJAX atau node.js atau hanya dalam menetapkan fungsionalitas untuk peristiwa interaksi pengguna (seperti klik mouse). Dalam kasus ini, seluruh gagasannya adalah untuk menunggu peristiwa kontinjensi terjadi sebelum menjalankan fungsi kustom. Ini jelas dalam kasus interaksi pengguna, tetapi juga penting dalam proses i / o (input / output) yang dapat memakan waktu, seperti membaca file dari disk. Di sinilah istilah "panggilan balik" masuk akal paling jelas. Setelah proses i / o dimulai (seperti meminta file untuk dibaca dari disk atau server untuk mengembalikan data dari permintaan http), sebuah asinkronProgram tidak menunggu sampai selesai. Itu dapat melanjutkan dengan tugas apa pun yang dijadwalkan berikutnya, dan hanya merespons dengan fungsi khusus setelah diberitahu bahwa file baca atau permintaan http selesai (atau gagal) dan bahwa data tersedia untuk fungsi kustom. Ini seperti menelepon bisnis di telepon dan meninggalkan nomor "panggilan balik" Anda, sehingga mereka dapat menghubungi Anda ketika seseorang tersedia untuk kembali kepada Anda. Itu lebih baik daripada menggantung di telepon untuk siapa yang tahu berapa lama dan tidak bisa menghadiri urusan lain.
Penggunaan asinkron secara inheren melibatkan beberapa cara mendengarkan acara yang diinginkan (misalnya, penyelesaian proses i / o) sehingga, ketika itu terjadi (dan hanya ketika itu terjadi) fungsionalitas "panggilan balik" kustom dijalankan. Dalam contoh AJAX yang jelas, ketika data benar-benar datang dari server, fungsi "callback" dipicu untuk menggunakan data itu untuk memodifikasi DOM dan karenanya menggambar ulang jendela browser sejauh itu.
Untuk rekap. Beberapa orang menggunakan kata "callback" untuk merujuk pada segala jenis fungsi khusus yang dapat disuntikkan ke fungsi yang ada sebagai argumen. Tetapi, setidaknya bagi saya, penggunaan kata yang paling tepat adalah di mana fungsi "panggilan balik" yang disuntikkan digunakan secara tidak serempak - hanya akan dijalankan pada saat suatu peristiwa yang menunggu untuk diberitahukan.
sumber
Array.prototype.forEach()
dan fungsi yang dilewatkan sebagai argumensetTimeout()
, dan mereka adalah kuda-kuda dengan warna yang berbeda sejauh cara Anda berpikir tentang program Anda .Dalam istilah non-programer, panggilan balik adalah isian yang kosong dalam suatu program.
Item umum pada banyak formulir kertas adalah "Orang yang dihubungi jika terjadi keadaan darurat". Ada garis kosong di sana. Anda menulis nama dan nomor telepon seseorang. Jika keadaan darurat terjadi, maka orang itu dipanggil.
Ini kuncinya. Anda tidak mengubah formulir (kodenya, biasanya milik orang lain). Namun Anda dapat mengisi informasi yang hilang ( nomor Anda ).
Contoh 1:
Callback digunakan sebagai metode khusus, mungkin untuk menambah / mengubah perilaku program. Misalnya, ambil beberapa kode C yang menjalankan fungsi, tetapi tidak tahu cara mencetak hasil. Yang bisa dilakukan hanyalah membuat string. Ketika mencoba mencari tahu apa yang harus dilakukan dengan string, ia melihat garis kosong. Tapi, programmer memberi Anda tempat kosong untuk menuliskan panggilan balik Anda!
Dalam contoh ini, Anda tidak menggunakan pensil untuk mengisi kosong pada selembar kertas, Anda menggunakan fungsinya
set_print_callback(the_callback)
.set_print_callback
adalah pensil,the_callback
informasi Anda sedang Anda isi.Anda sekarang telah mengisi baris kosong ini dalam program. Setiap kali perlu mencetak output, itu akan melihat baris kosong itu, dan ikuti instruksi di sana (yaitu memanggil fungsi yang Anda letakkan di sana.) Secara praktis, ini memungkinkan kemungkinan pencetakan untuk menyaring, ke file log, ke printer, melalui koneksi jaringan, atau kombinasi daripadanya. Anda telah mengisi bagian yang kosong dengan apa yang ingin Anda lakukan.
Contoh 2:
Ketika Anda diberi tahu bahwa Anda perlu memanggil nomor darurat, Anda pergi dan membaca apa yang tertulis di formulir kertas, dan kemudian memanggil nomor yang Anda baca. Jika garis itu kosong, tidak ada yang akan dilakukan.
Pemrograman Gui bekerja dengan cara yang sama. Ketika sebuah tombol diklik, program perlu mencari tahu apa yang harus dilakukan selanjutnya. Ia pergi dan mencari callback. Callback ini kebetulan berada di tempat kosong berlabel "Inilah yang Anda lakukan ketika Button1 diklik"
Sebagian besar IDE akan secara otomatis mengisi bagian yang kosong untuk Anda (tulis metode dasar) ketika Anda memintanya (misalnya
button1_clicked
). Namun kosong itu dapat memiliki metode apa pun yang sangat Anda sukai . Anda bisa memanggil metoderun_computations
ataubutter_the_biscuits
selama Anda memasukkan nama panggilan balik itu di tempat yang tepat. Anda dapat mengosongkan "555-555-1212" di nomor darurat. Itu tidak masuk akal, tapi itu dibolehkan.Catatan akhir: Baris kosong yang Anda isi dengan callback? Itu bisa dihapus dan ditulis ulang sesuka hati. (Apakah Anda harus atau tidak adalah pertanyaan lain, tetapi itu adalah bagian dari kekuatan mereka)
sumber
Selalu lebih baik untuk memulai dengan contoh :).
Anggap Anda memiliki dua modul A dan B.
Anda ingin modul A diberi tahu ketika beberapa peristiwa / kondisi terjadi di modul B. Namun, modul B tidak tahu tentang modul Anda A. Yang diketahui adalah alamat ke fungsi tertentu (modul A) melalui penunjuk fungsi yang disediakan oleh modul A.
Jadi yang harus dilakukan B sekarang adalah "callback" ke dalam modul A ketika peristiwa / kondisi tertentu terjadi dengan menggunakan pointer fungsi. A dapat melakukan pemrosesan lebih lanjut di dalam fungsi panggilan balik.
*) Keuntungan yang jelas di sini adalah bahwa Anda mencabut semua tentang modul A dari modul B. Modul B tidak perlu peduli siapa / apa modul A itu.
sumber
Johny programmer membutuhkan stapler, jadi dia pergi ke departemen persediaan kantor dan meminta satu, setelah mengisi formulir permintaan dia bisa berdiri di sana dan menunggu petugas pergi melihat-lihat gudang untuk stapler (seperti panggilan fungsi pemblokiran ) atau lakukan hal lain sementara itu.
karena ini biasanya membutuhkan waktu, johny meletakkan catatan bersama dengan formulir permintaan meminta mereka untuk memanggilnya ketika stapler siap untuk diambil, sehingga sementara itu dia bisa pergi melakukan sesuatu yang lain seperti tidur di mejanya.
sumber
Bayangkan Anda membutuhkan fungsi yang mengembalikan 10 kuadrat sehingga Anda menulis fungsi:
Kemudian Anda perlu 9 kuadrat sehingga Anda menulis fungsi lain:
Akhirnya Anda akan mengganti semua ini dengan fungsi generik:
Pemikiran yang sama persis berlaku untuk panggilan balik. Anda memiliki fungsi yang melakukan sesuatu dan ketika selesai melakukan panggilan doA:
Kemudian Anda ingin fungsi yang sama persis untuk memanggil doB sebagai gantinya Anda dapat menduplikasi seluruh fungsi:
Atau Anda bisa melewatkan fungsi panggilan balik sebagai variabel dan hanya perlu memiliki fungsi sekali:
Maka Anda hanya perlu memanggil compute (doA) dan compute (doB).
Selain menyederhanakan kode, ini memungkinkan kode asinkron memberi tahu Anda telah selesai dengan memanggil fungsi sewenang-wenang Anda pada penyelesaian, mirip dengan ketika Anda memanggil seseorang di telepon dan meninggalkan nomor panggilan balik.
sumber
Anda merasa sakit sehingga Anda pergi ke dokter. Dia memeriksa Anda dan memastikan Anda membutuhkan obat. Dia meresepkan beberapa obat-obatan dan memanggil resep ke apotek lokal Anda. Kamu pulang. Kemudian, apotek Anda menelepon untuk memberi tahu Anda bahwa resep Anda siap. Anda pergi dan mengambilnya.
sumber
Ada dua hal untuk dijelaskan, satu adalah cara kerja callback (melewati fungsi yang dapat dipanggil tanpa mengetahui konteksnya), yang lain untuk apa fungsi itu digunakan (menangani acara secara tidak serempak).
Analogi menunggu bingkisan tiba yang telah digunakan oleh jawaban lain adalah baik untuk menjelaskan keduanya. Dalam program komputer, Anda akan memberi tahu komputer untuk mengharapkan sebuah paket. Biasanya, sekarang akan duduk di sana dan menunggu (dan tidak melakukan apa pun) sampai parsel tiba, mungkin tanpa batas waktu jika tidak pernah tiba. Bagi manusia, ini terdengar konyol, tetapi tanpa langkah lebih lanjut, ini benar-benar alami untuk komputer.
Sekarang panggilan balik akan menjadi bel di pintu depan Anda. Anda memberikan layanan paket dengan cara untuk memberi tahu Anda tentang kedatangan paket tanpa mereka harus tahu di mana (bahkan jika) Anda berada di rumah, atau bagaimana bel bekerja. (Misalnya, beberapa "bel" sebenarnya mengirimkan panggilan telepon.) Karena Anda memberikan "fungsi panggil balik" yang dapat "dipanggil" kapan saja, di luar konteks, kini Anda dapat berhenti duduk di teras depan dan "menangani event "(kedatangan paket) kapan pun waktunya.
sumber
Bayangkan seorang teman meninggalkan rumah Anda, dan Anda memberi tahu dia "Panggil saya ketika Anda sampai di rumah sehingga saya tahu Anda tiba dengan selamat"; itu adalah (secara harfiah) panggilan kembali . Itulah fungsi panggilan balik, apa pun bahasanya. Anda ingin beberapa prosedur untuk memberikan kontrol kembali kepada Anda ketika telah menyelesaikan beberapa tugas, sehingga Anda memberikannya fungsi untuk digunakan untuk memanggil kembali kepada Anda.
Dalam Python, misalnya,
grabDBValue
bisa ditulis hanya untuk mengambil nilai dari database dan kemudian membiarkan Anda menentukan apa yang sebenarnya harus dilakukan dengan nilai, sehingga ia menerima fungsi. Anda tidak tahu kapan atau apakahgrabDBValue
akan kembali, tetapi jika / ketika itu kembali, Anda tahu apa yang ingin Anda lakukan. Di sini, saya mengirimkan fungsi anonim (atau lambda ) yang mengirimkan nilai ke jendela GUI. Saya dapat dengan mudah mengubah perilaku program dengan melakukan ini:Callback bekerja dengan baik dalam bahasa di mana fungsi adalah nilai kelas pertama , seperti integer biasa, string karakter, boolean, dll. Dalam C, Anda dapat "meneruskan" fungsi sekitar dengan mengedarkan pointer ke sana dan penelepon dapat menggunakannya; di Jawa, pemanggil akan meminta kelas statis dari jenis tertentu dengan nama metode tertentu karena tidak ada fungsi ("metode," benar-benar) di luar kelas; dan di sebagian besar bahasa dinamis lainnya Anda hanya dapat melewatkan fungsi dengan sintaksis sederhana.
Protip:
Dalam bahasa dengan pelingkupan leksikal (seperti Skema atau Perl) Anda dapat melakukan trik seperti ini:
$val
dalam hal ini akan6
karena callback memiliki akses ke variabel yang dideklarasikan dalam lingkungan leksikal di mana ia didefinisikan. Lingkup leksikal dan panggilan balik anonim adalah kombinasi yang kuat yang menuntut studi lebih lanjut untuk programmer pemula.sumber
Anda memiliki beberapa kode yang ingin Anda jalankan. Biasanya, ketika Anda menyebutnya Anda kemudian menunggu untuk selesai sebelum Anda melanjutkan (yang dapat menyebabkan aplikasi Anda menjadi abu-abu / menghasilkan waktu pemintalan untuk kursor).
Metode alternatif adalah menjalankan kode ini secara paralel dan melanjutkan pekerjaan Anda sendiri. Tetapi bagaimana jika kode asli Anda perlu melakukan hal-hal yang berbeda tergantung pada respons dari kode yang disebutnya? Nah, dalam hal ini Anda bisa memasukkan nama / lokasi kode yang Anda ingin panggil ketika selesai. Ini adalah "panggilan balik".
Kode normal: Minta Informasi-> Proses Informasi-> Berurusan dengan hasil Pemrosesan-> Lanjutkan untuk melakukan hal-hal lain.
Dengan panggilan balik: Minta Informasi-> Proses Informasi-> Lanjutkan untuk melakukan hal-hal lain. Dan di beberapa titik kemudian-> Berurusan dengan hasil Pemrosesan.
sumber
Tanpa panggilan balik, sumber daya pemrograman khusus lainnya (seperti threading, dan lain-lain), suatu program merupakan urutan instruksi yang dieksekusi secara berurutan , dan bahkan dengan semacam "perilaku dinamis" yang ditentukan oleh kondisi tertentu, semua skenario yang mungkin harus diprogram sebelumnya .
Jadi, Jika kita perlu memberikan perilaku dinamis nyata untuk suatu program, kita dapat menggunakan panggilan balik. Dengan panggilan balik Anda dapat menginstruksikan oleh parameter, program untuk memanggil program lain yang menyediakan beberapa parameter yang telah ditentukan sebelumnya dan dapat mengharapkan beberapa hasil ( ini adalah kontrak atau tanda tangan operasi ), sehingga hasil ini dapat diproduksi / diproses oleh program pihak ketiga yang tidak sebelumnya diketahui.
Teknik ini adalah dasar dari polimorfisme yang diterapkan pada program, fungsi, objek dan semua kesatuan lainnya dari kode yang dijalankan oleh komputer.
Dunia manusia yang digunakan sebagai contoh untuk menelepon kembali dijelaskan dengan bagus ketika Anda melakukan beberapa pekerjaan, misalkan Anda adalah seorang pelukis (di sini Anda adalah program utama, yang melukis ) dan kadang-kadang menelepon klien Anda untuk memintanya menyetujui hasil pekerjaan Anda. , jadi, ia memutuskan apakah gambarnya bagus ( klien Anda adalah program pihak ketiga ).
Dalam contoh di atas Anda adalah seorang pelukis dan "mendelegasikan" pekerjaan kepada orang lain untuk menyetujui hasilnya, gambar adalah parameter, dan setiap klien baru (fungsi "dipanggil" kembali) mengubah hasil pekerjaan Anda memutuskan apa yang diinginkannya tentang gambar ( keputusan yang dibuat oleh klien adalah hasil yang dikembalikan dari "fungsi panggilan balik" ).
Semoga penjelasan ini bermanfaat.
sumber
Mari kita berpura-pura memberi saya tugas yang berpotensi jangka panjang: dapatkan nama-nama dari lima orang unik pertama yang Anda temui. Ini mungkin memakan waktu berhari-hari jika saya berada di daerah yang jarang penduduknya. Anda tidak benar-benar tertarik duduk di tangan Anda sementara saya berlarian sehingga Anda berkata, "Ketika Anda sudah memiliki daftar itu, panggil saya di sel saya dan bacakan kembali kepada saya. Ini nomornya.".
Anda telah memberi saya referensi panggilan balik - fungsi yang seharusnya saya jalankan untuk memberikan pemrosesan lebih lanjut.
Dalam JavaScript, tampilannya mungkin seperti ini:
Ini mungkin dapat ditingkatkan dengan banyak cara. Misalnya, Anda bisa memberikan panggilan balik kedua: jika berakhir lebih lama dari satu jam, hubungi telepon merah dan beri tahu orang yang menjawab bahwa Anda sudah kehabisan waktu.
sumber
Panggilan balik paling mudah dijelaskan dalam hal sistem telepon. Panggilan fungsi analog dengan memanggil seseorang di telepon, mengajukan pertanyaan kepadanya, mendapatkan jawaban, dan menutup telepon; menambahkan callback mengubah analoginya sehingga setelah mengajukan pertanyaan kepadanya, Anda juga memberikan nama dan nomor Anda sehingga dia dapat menghubungi Anda kembali dengan jawabannya. - Paul Jakubik, "Implementasi Callback di C ++"
sumber
Panggilan balik adalah fungsi yang akan dipanggil oleh fungsi kedua. Fungsi kedua ini tidak tahu sebelumnya apa fungsi yang akan dipanggil. Jadi identitas fungsi panggilan balik disimpan di suatu tempat, atau diteruskan ke fungsi kedua sebagai parameter. "Identitas" ini, tergantung pada bahasa pemrograman, mungkin alamat dari panggilan balik, atau semacam penunjuk lain, atau itu mungkin nama fungsi. Prinsipnya sama, kami menyimpan atau meneruskan beberapa informasi yang jelas mengidentifikasi fungsi.
Ketika saatnya tiba, fungsi kedua dapat memanggil callback, memasok parameter tergantung pada keadaan pada saat itu. Bahkan mungkin memilih callback dari serangkaian kemungkinan callback. Bahasa pemrograman harus menyediakan semacam sintaks untuk memungkinkan fungsi kedua memanggil callback, mengetahui "identitasnya."
Mekanisme ini memiliki banyak kegunaan yang mungkin. Dengan panggilan balik, perancang suatu fungsi dapat membiarkannya dikustomisasi dengan meminta panggilan apa pun yang diberikan kembali. Misalnya, fungsi penyortiran mungkin mengambil panggilan balik sebagai parameter, dan panggilan balik ini mungkin berfungsi untuk membandingkan dua elemen untuk memutuskan mana yang lebih dulu.
Omong-omong, tergantung pada bahasa pemrograman, kata "fungsi" dalam diskusi di atas mungkin diganti dengan "blokir," "penutupan," "lambda," dll.
sumber
Biasanya kami mengirim variabel ke fungsi. Misalkan Anda memiliki tugas di mana variabel perlu diproses sebelum diberikan sebagai argumen - Anda dapat menggunakan panggilan balik.
function1(var1, var2)
adalah cara yang biasa.Bagaimana jika saya ingin
var2
diproses dan kemudian dikirim sebagai argumen?function1(var1, function2(var2))
Ini adalah salah satu jenis panggilan balik - di mana
function2
mengeksekusi beberapa kode dan mengembalikan variabel kembali ke fungsi awal.sumber
Penjelasan metaforis:
Saya punya parsel yang ingin saya kirim ke teman, dan saya juga ingin tahu kapan teman saya menerimanya.
Jadi saya membawa bungkusan itu ke kantor pos dan meminta mereka untuk mengirimkannya. Jika saya ingin tahu kapan teman saya menerima bungkusan itu, saya punya dua opsi:
(a) Saya bisa menunggu di kantor pos sampai dikirim.
(B) Saya akan mendapatkan email saat dikirimkan.
Opsi (b) analog dengan panggilan balik.
sumber
Untuk mengajarkan panggilan balik, Anda harus mengajarkan pointer terlebih dahulu. Setelah siswa memahami gagasan pointer ke variabel, gagasan panggilan balik akan menjadi lebih mudah. Dengan asumsi Anda menggunakan C / C ++, langkah-langkah ini dapat diikuti.
Mungkin ada banyak hal lagi. Libatkan siswa dan mereka akan menemukan. Semoga ini membantu.
sumber
Dalam bahasa Inggris yang sederhana, panggilan balik adalah sebuah janji. Joe, Jane, David dan Samantha berbagi tempat parkir untuk bekerja. Joe mengemudi hari ini. Jane, David dan Samantha memiliki beberapa opsi:
Opsi 1: Ini lebih seperti contoh polling di mana Jane akan terjebak dalam "lingkaran" memeriksa apakah Joe ada di luar. Jane tidak bisa melakukan hal lain untuk sementara waktu.
Opsi 2: Ini adalah contoh panggilan balik. Jane memberitahu Joe untuk membunyikan bel pintu ketika dia di luar. Dia memberinya "fungsi" untuk membunyikan bel pintu. Joe tidak perlu tahu bagaimana bel pintu bekerja atau di mana itu, dia hanya perlu memanggil fungsi itu yaitu membunyikan bel pintu ketika dia ada di sana.
Panggilan balik didorong oleh "acara". Dalam contoh ini "acara" adalah kedatangan Joe. Dalam Ajax misalnya acara dapat "berhasil" atau "gagal" dari permintaan asinkron dan masing-masing dapat memiliki panggilan balik yang sama atau berbeda.
Dalam hal aplikasi JavaScript dan panggilan balik. Kita juga perlu memahami "penutupan" dan konteks aplikasi. Apa yang dimaksud dengan "ini" dapat dengan mudah membingungkan pengembang JavaScript. Dalam contoh ini dalam metode / panggilan balik "ring_the_door_bell ()" setiap orang mungkin ada beberapa metode lain yang perlu dilakukan setiap orang berdasarkan ex rutinitas pagi mereka. "Matikan tvnya()". Kami ingin "ini" merujuk ke objek "Jane" atau objek "David" sehingga masing-masing dapat mengatur apa pun yang mereka butuhkan sebelum Joe mengambilnya. Di sinilah pengaturan callback dengan Joe membutuhkan memparodikan metode sehingga "ini" mengacu pada objek yang tepat.
Semoga itu bisa membantu!
sumber
Panggilan balik adalah amplop bermesin yang ditujukan sendiri. Ketika Anda memanggil suatu fungsi, itu seperti mengirim surat. Jika Anda ingin fungsi itu memanggil fungsi lain, Anda memberikan informasi itu dalam bentuk referensi atau alamat.
sumber
Saya pikir ini tugas yang agak mudah untuk dijelaskan.
Pada panggilan balik pertama hanya fungsi biasa.
Dan selanjutnya, kita memanggil fungsi ini (sebut saja A) dari dalam fungsi lain (sebut saja B).
Keajaiban tentang ini adalah saya yang memutuskan, fungsi mana yang harus dipanggil oleh fungsi dari luar B.
Pada saat saya menulis fungsi, BI tidak tahu fungsi callback mana yang harus dipanggil. Pada saat saya memanggil fungsi, BI juga memberi tahu fungsi ini untuk memanggil fungsi A. Itu saja.
sumber
Apa itu Fungsi Panggilan Balik?
Jawaban sederhana untuk pertanyaan pertama ini adalah bahwa fungsi callback adalah fungsi yang dipanggil melalui pointer fungsi. Jika Anda melewatkan pointer (alamat) suatu fungsi sebagai argumen ke yang lain, ketika pointer itu digunakan untuk memanggil fungsi itu menunjuk ke sana dikatakan bahwa panggilan balik dilakukan.
Fungsi panggilan balik sulit dilacak, tetapi terkadang sangat berguna. Terutama saat Anda mendesain perpustakaan. Fungsi panggilan balik seperti meminta pengguna Anda untuk memberi Anda nama fungsi, dan Anda akan memanggil fungsi itu dalam kondisi tertentu.
Misalnya, Anda menulis timer panggilan balik. Ini memungkinkan Anda menentukan durasi dan fungsi apa yang harus dipanggil, dan fungsi tersebut akan menjadi panggilan balik yang sesuai. “Jalankan fungsi saya () setiap 10 detik selama 5 kali”
Atau Anda dapat membuat direktori fungsi, melewati daftar nama fungsi dan meminta pustaka untuk memanggil kembali sesuai. "Panggilan balik sukses () jika berhasil, panggilan balik gagal () jika gagal."
Mari kita lihat contoh pointer fungsi sederhana
Bagaimana cara menyampaikan argumen ke fungsi panggilan balik?
Mengamati bahwa pointer fungsi untuk mengimplementasikan panggilan balik tidak berlaku *, yang menunjukkan bahwa ia dapat mengambil semua jenis variabel termasuk struktur. Oleh karena itu Anda dapat menyampaikan beberapa argumen berdasarkan struktur.
sumber
Panggilan balik adalah metode yang dijadwalkan untuk dieksekusi ketika suatu kondisi terpenuhi.
Contoh "dunia nyata" adalah toko video game lokal. Anda menunggu Half-Life 3. Alih-alih pergi ke toko setiap hari untuk melihat apakah itu masuk, Anda mendaftarkan email Anda pada daftar untuk diberi tahu ketika permainan tersedia. Email menjadi "panggilan balik" Anda dan syarat yang harus dipenuhi adalah ketersediaan game.
Contoh "programmer" adalah halaman web tempat Anda ingin melakukan tindakan ketika tombol diklik. Anda mendaftarkan metode panggilan balik untuk suatu tombol dan melanjutkan melakukan tugas-tugas lain. Ketika / jika pengguna menekan tombol, browser akan melihat daftar panggilan balik untuk peristiwa itu dan memanggil metode Anda.
Panggilan balik adalah cara untuk menangani acara secara tidak sinkron. Anda tidak akan pernah tahu kapan callback akan dieksekusi, atau apakah akan dieksekusi sama sekali. Keuntungannya adalah ia membebaskan program dan siklus CPU Anda untuk melakukan tugas-tugas lain sambil menunggu balasan.
sumber
Sederhana dan sederhana: Panggilan balik adalah fungsi yang Anda berikan ke fungsi lain, sehingga dapat memanggilnya .
Biasanya disebut ketika beberapa operasi selesai. Karena Anda membuat panggilan balik sebelum memberikannya ke fungsi lain, Anda dapat menginisialisasi dengan informasi konteks dari situs panggilan. Itulah mengapa ia dinamai panggilan * kembali * - fungsi pertama memanggil kembali ke dalam konteks dari mana ia dipanggil.
sumber
“Dalam pemrograman komputer, panggilan balik adalah referensi ke kode yang dapat dieksekusi, atau bagian dari kode yang dapat dieksekusi, yang diteruskan sebagai argumen ke kode lain. Ini memungkinkan lapisan perangkat lunak tingkat rendah untuk memanggil subrutin (atau fungsi) yang didefinisikan dalam lapisan tingkat yang lebih tinggi. " - Wikipedia
Callback di C menggunakan Function Pointer
Di C, callback diimplementasikan menggunakan Function Pointer. Function Pointer - seperti namanya, adalah penunjuk ke suatu fungsi.
Misalnya, int (* ptrFunc) ();
Di sini, ptrFunc adalah pointer ke fungsi yang tidak menggunakan argumen dan mengembalikan integer. JANGAN lupa untuk memasukkan tanda kurung, jika tidak kompiler akan menganggap bahwa ptrFunc adalah nama fungsi normal, yang tidak mengambil apa-apa dan mengembalikan pointer ke integer.
Berikut ini beberapa kode untuk mendemonstrasikan penunjuk fungsi.
Sekarang mari kita mencoba memahami konsep Callback di C menggunakan pointer fungsi.
Program lengkap memiliki tiga file: callback.c, reg_callback.h dan reg_callback.c.
Jika kita menjalankan program ini, hasilnya akan menjadi
Ini adalah program yang menunjukkan fungsi callback di dalam register_callback di dalam my_callback kembali ke dalam program utama
Fungsi lapisan yang lebih tinggi memanggil fungsi lapisan bawah sebagai panggilan normal dan mekanisme panggilan balik memungkinkan fungsi lapisan bawah untuk memanggil fungsi lapisan yang lebih tinggi melalui penunjuk ke fungsi panggilan balik.
Callback di Java Menggunakan Antarmuka
Java tidak memiliki konsep pointer fungsi. Ia mengimplementasikan mekanisme Callback melalui mekanisme Interface-nya. Di sini alih-alih pointer fungsi, kami mendeklarasikan sebuah Interface yang memiliki metode yang akan dipanggil ketika callee menyelesaikan tugasnya.
Izinkan saya menunjukkannya melalui contoh:
Antarmuka Panggilan Balik
Penelepon atau Kelas Tingkat Tinggi
Fungsi Callee atau lapisan bawah
Callback Menggunakan pola EventListener
Pola ini digunakan untuk memberi tahu 0 hingga n jumlah Pengamat / Pendengar bahwa tugas tertentu telah selesai
Perbedaan antara mekanisme Callback dan mekanisme EventListener / Observer adalah bahwa dalam callback, callee memberi tahu penelepon tunggal, sedangkan dalam Eventlisener / Observer, callee dapat memberi tahu siapa pun yang tertarik dengan peristiwa itu (notifikasi dapat pergi ke beberapa bagian lain dari aplikasi yang belum memicu tugas)
Izinkan saya menjelaskannya melalui contoh.
Antarmuka Acara
Widget kelas
Tombol Kelas
Kotak centang kelas
Kelas Kegiatan
package com.som_itsolutions.training.java.exampleeventlistener;
Kelas Lainnya
Kelas Utama
Seperti yang dapat Anda lihat dari kode di atas, bahwa kami memiliki antarmuka yang disebut peristiwa yang pada dasarnya mencantumkan semua peristiwa yang mungkin terjadi untuk aplikasi kami. Kelas Widget adalah kelas dasar untuk semua komponen UI seperti Tombol, Kotak Centang. Komponen UI ini adalah objek yang benar-benar menerima peristiwa dari kode kerangka kerja. Kelas widget mengimplementasikan antarmuka Acara dan juga memiliki dua antarmuka bersarang yaitu OnClickEventListener & OnLongClickEventListener
Kedua antarmuka ini bertanggung jawab untuk mendengarkan acara yang mungkin terjadi pada komponen UI yang diturunkan dari Widget seperti Tombol atau Kotak Centang. Jadi jika kita membandingkan contoh ini dengan contoh Callback sebelumnya menggunakan Java Interface, kedua antarmuka ini berfungsi sebagai antarmuka Callback. Jadi kode tingkat yang lebih tinggi (Aktivitas Di Sini) mengimplementasikan dua antarmuka ini. Dan setiap kali suatu peristiwa terjadi pada widget, kode tingkat yang lebih tinggi (atau metode antarmuka ini diimplementasikan dalam kode tingkat yang lebih tinggi, yang ada di sini Kegiatan) akan dipanggil.
Sekarang saya akan membahas perbedaan mendasar antara pola Callback dan Eventlistener. Seperti yang telah kami sebutkan bahwa menggunakan Callback, Callee hanya dapat memberi tahu Penelepon tunggal. Tetapi dalam kasus pola EventListener, setiap bagian atau kelas Aplikasi dapat mendaftar untuk acara yang mungkin terjadi pada Tombol atau Kotak Centang. Contoh kelas semacam ini adalah OtherClass. Jika Anda melihat kode OtherClass, Anda akan mendapati bahwa kode itu telah terdaftar sebagai pendengar ClickEvent yang mungkin muncul di Tombol yang ditentukan dalam Kegiatan. Bagian yang menarik adalah bahwa, di samping Activity (Penelepon), OtherClass ini juga akan diberitahukan setiap kali klik terjadi pada Button.
sumber
Callback memungkinkan Anda untuk memasukkan kode Anda sendiri ke dalam blok kode lain untuk dieksekusi di waktu lain, yang mengubah atau menambah perilaku blok kode lain itu sesuai dengan kebutuhan Anda. Anda mendapatkan fleksibilitas dan kemampuan penyesuaian sementara dapat memiliki kode yang lebih dapat dikelola.
Kurang hardcode = lebih mudah untuk dipelihara dan diubah = lebih sedikit waktu = lebih banyak nilai bisnis = kedahsyatan.
Misalnya, dalam javascript, menggunakan Underscore.js, Anda bisa menemukan semua elemen genap dalam array seperti ini:
Contoh milik Underscore.js: http://documentcloud.github.com/underscore/#filter
sumber
[diedit] ketika kita memiliki dua fungsi yaitu functionA dan functionB , jika functionA bergantung pada functionB .
maka kita memanggil functionB sebagai fungsi callback . Ini banyak digunakan dalam kerangka Spring.
sumber
Pikirkan metode sebagai memberikan tugas kepada rekan kerja. Tugas sederhana mungkin sebagai berikut:
Rekan kerja Anda rajin menghitung dan memberi Anda hasil berikut:
Tetapi rekan kerja Anda memiliki masalah, ia tidak selalu memahami notasi, seperti
^
, tetapi ia memahaminya dengan deskripsi mereka. Sepertiexponent
. Setiap kali dia menemukan salah satu dari ini Anda mendapatkan yang berikut:Ini mengharuskan Anda untuk menulis ulang seluruh set instruksi Anda lagi setelah menjelaskan apa arti karakter itu kepada rekan kerja Anda, dan dia tidak selalu ingat di antara pertanyaan. Dan dia juga kesulitan mengingat tipmu, seperti tanyakan saja padaku. Namun dia selalu mengikuti arahan tertulis Anda sebaik mungkin.
Anda memikirkan solusi, Anda hanya menambahkan yang berikut ini ke semua instruksi Anda:
Sekarang, setiap kali dia memiliki masalah, dia memanggil Anda dan bertanya, alih-alih memberi Anda respons buruk dan membuat proses memulai kembali.
sumber
Ini darinya dalam hal mengunduh halaman web:
Program Anda berjalan di ponsel dan meminta halaman web http://www.google.com . Jika Anda menulis program secara sinkron, fungsi yang Anda tulis untuk mengunduh data akan terus berjalan hingga semua data diunduh. Ini berarti UI Anda tidak akan di-refresh dan pada dasarnya akan tampak beku. Jika Anda menulis program menggunakan panggilan balik, Anda meminta data dan mengatakan "jalankan fungsi ini setelah selesai." Ini memungkinkan UI untuk tetap memungkinkan interaksi pengguna saat file sedang diunduh. Setelah halaman web selesai mengunduh, fungsi hasil Anda (panggilan balik) dipanggil dan Anda dapat menangani datanya.
Pada dasarnya, ini memungkinkan Anda untuk meminta sesuatu dan terus mengeksekusi sambil menunggu hasilnya. Setelah hasilnya kembali kepada Anda melalui fungsi panggilan balik, Anda dapat mengambil operasi di mana itu ditinggalkan.
sumber