Apakah ada cara untuk melewatkan lebih banyak data ke fungsi panggilan balik di jQuery?
Saya memiliki dua fungsi dan saya ingin panggilan balik ke $.post
, misalnya, untuk meneruskan data yang dihasilkan dari panggilan AJAX, serta beberapa argumen khusus
function clicked() {
var myDiv = $("#my-div");
// ERROR: Says data not defined
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
// ERROR: Would pass in myDiv as curData (wrong)
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
}
function doSomething(curData, curDiv) {
}
Saya ingin dapat meneruskan parameter saya sendiri ke panggilan balik, serta hasilnya dikembalikan dari panggilan AJAX.
Jawaban:
Solusinya adalah pengikatan variabel melalui penutupan.
Sebagai contoh yang lebih mendasar, berikut adalah contoh fungsi yang menerima dan memanggil fungsi panggilan balik, serta contoh fungsi panggilan balik:
Ini memanggil panggilan balik dan memasok satu argumen. Sekarang Anda ingin memberikan argumen tambahan, sehingga Anda menutup callback sebagai penutup.
Atau, lebih sederhana menggunakan Fungsi Panah ES6 :
Adapun contoh spesifik Anda, saya belum menggunakan
.post
fungsi di jQuery, tetapi pemindaian cepat dokumentasi menunjukkan panggilan kembali harus menjadi penunjuk fungsi dengan tanda tangan berikut:Karena itu saya pikir solusinya adalah sebagai berikut:
Apa yang terjadi?
Di baris terakhir,
doSomething(extraStuff)
yang dipanggil dan hasil doa yang merupakan pointer fungsi .Karena
extraStuff
dilewatkan sebagai argumen untukdoSomething
itu berada dalam lingkupdoSomething
fungsi.Ketika
extraStuff
direferensikan dalam fungsi batin anonim yang dikembalikandoSomething
itu terikat oleh penutupan denganextraStuff
argumen fungsi luar itu . Ini benar bahkan setelahdoSomething
kembali.Saya belum menguji di atas, tetapi saya telah menulis kode yang sangat mirip dalam 24 jam terakhir dan berfungsi seperti yang saya jelaskan.
Anda tentu saja dapat melewati beberapa variabel, bukan objek 'ekstraStuff' tunggal tergantung pada preferensi pribadi Anda / standar pengkodean.
sumber
Saat menggunakan
doSomething(data, myDiv)
, Anda benar-benar memanggil fungsi dan tidak membuat referensi untuk itu.Anda dapat melewati
doStomething
fungsi secara langsung tetapi Anda harus memastikannya memiliki tanda tangan yang benar.Jika Anda ingin tetap melakukan sesuatu seperti itu, Anda dapat membungkus panggilannya dalam fungsi anonim.
Di dalam kode fungsi anonim, Anda dapat menggunakan variabel yang ditentukan dalam lingkup terlampir. Ini adalah cara pelingkupan Javascript bekerja.
sumber
return function(...){...}
fungsi tambahan di dalamdoSomething
fungsi. Saya menemukan contoh jelas lain dari konsep yang sama di sini: theelitist.net/...(function(myDiv){ ... })(myDiv)
untuk menangkap variabelmyDiv
. Ini secara implisit dilakukan dalam jawaban @bradhouse.Ini sebenarnya lebih mudah daripada semua orang membuatnya terdengar ... terutama jika Anda menggunakan
$.ajax({})
sintaks dasar vs salah satu fungsi pembantu.Cukup berikan
key: value
pasangan seperti pada objek apa pun, ketika Anda mengatur permintaan ajax Anda ... (karena$(this)
belum mengubah konteks, itu masih menjadi pemicu untuk panggilan bind di atas)Salah satu alasan ini lebih baik daripada mengatur var, adalah bahwa var bersifat global dan karena itu, ditimpa ... jika Anda memiliki 2 hal yang dapat memicu panggilan ajax, secara teori Anda dapat memicu mereka lebih cepat daripada merespon panggilan ajax, dan Anda akan memiliki nilai untuk panggilan kedua masuk ke yang pertama. Menggunakan metode ini, di atas, itu tidak akan terjadi (dan itu cukup mudah digunakan juga).
sumber
closure
saya hanya perlu untuk bekerja dan ini benar-benar kartu as, bersih, sederhana dan non global.Di dunia sekarang ini ada jawaban lain yang lebih bersih, dan diambil dari jawaban Stack Overflow lainnya:
Inilah pertanyaan dan jawaban asli: jQuery BAGAIMANA CARA ?? lulus parameter tambahan untuk panggilan balik sukses untuk $ .ajax panggilan?
sumber
Anda juga dapat mencoba sesuatu seperti berikut ini:
sumber
Anda dapat menggunakan penutupan JavaScript:
dan kapan Anda bisa melakukannya:
sumber
Saya telah membuat kesalahan dalam posting terakhir saya. Ini adalah contoh yang berfungsi untuk cara menyampaikan argumen tambahan dalam fungsi panggilan balik:
sumber
Ayo sederhana! :)
sumber
Solusi yang lebih umum untuk mengirim permintaan asinkron menggunakan
.ajax()
API jQuery dan penutupan untuk meneruskan parameter tambahan ke fungsi panggilan balik:sumber
Bagi saya, dan pemula lainnya yang baru saja kontak dengan Javascript,
saya pikir itu
Closeure Solution
agak terlalu membingungkan.Sementara saya menemukan itu, Anda dapat dengan mudah melewati banyak parameter yang Anda inginkan untuk setiap panggilan balik ajax menggunakan jquery.
Berikut adalah dua solusi yang lebih mudah .
Pertama, yang @zeroasterisk sebutkan di atas, contoh:
Yang kedua, berikan data yang didefinisikan sendiri dengan menambahkannya ke data
XHR object
yang ada di seluruh rentang kehidupan ajax-request-response.Seperti yang Anda lihat, dua solusi ini memiliki kelemahan: Anda perlu menulis lebih banyak kode setiap kali daripada hanya menulis:
Baca lebih lanjut tentang $ .ajax: http://api.jquery.com/jquery.ajax/
sumber
Jika seseorang masih datang ke sini, ini adalah pendapat saya:
Apa yang terjadi di sini, setelah mengikat ke fungsi panggilan balik, itu akan tersedia dalam fungsi sebagai
this
.Ide ini berasal dari bagaimana Bereaksi menggunakan
bind
fungsionalitas.sumber
Cara sekunder:
sumber
sebenarnya, kode Anda tidak berfungsi karena ketika Anda menulis:
Anda menempatkan panggilan fungsi sebagai parameter ketiga daripada referensi fungsi .
sumber
Sebagai tambahan untuk jawaban b01 , argumen kedua
$.proxy
sering digunakan untuk mempertahankanthis
referensi. Argumen tambahan yang diteruskan ke$.proxy
sebagian diterapkan ke fungsi, pra-mengisinya dengan data. Perhatikan bahwa argumen apa pun yang$.post
lolos ke panggilan balik akan diterapkan di akhir, jadidoSomething
harus ada argumen di akhir daftar argumennya:Pendekatan ini juga memungkinkan beberapa argumen terikat ke callback:
sumber