Saya punya masalah kecil dengan fungsi jquery $ .ajax ().
Saya memiliki formulir di mana setiap klik pada tombol radio atau pilihan dari menu tarik-turun membuat variabel sesi dengan nilai yang dipilih.
Sekarang - Saya memiliki salah satu menu tarik-turun yang memiliki 4 opsi - yang pertama (dengan label Tidak Ada) memiliki nilai = "" yang lain memiliki idnya.
Apa yang saya inginkan terjadi adalah pada opsi Tidak Ada (dengan nilai kosong) untuk menghapus sesi dan lainnya untuk membuatnya, tetapi hanya jika sesi dengan nama pilihan khusus ini belum ada - karena semua opsi lain memiliki jumlah yang sama yang ditetapkan padanya - itu hanya menunjukkan mana yang dipilih.
Saya tidak yakin apakah itu masuk akal - tetapi lihat kodenya - mungkin ini akan membuatnya lebih jelas:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
if(isSession(name) == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
jadi - pertama-tama ketika #add_ons menu pilih memicu "perubahan" kami mendapatkan beberapa nilai dari beberapa elemen untuk kalkulasi.
kami mendapatkan atribut label opsi dari pilihan kami yang menyimpan nilai yang akan ditambahkan ke total, nama yang dipilih untuk membuat sesi dengan nama ini dan nilai untuk kemudian memeriksa mana yang dipilih.
sekarang - kami memeriksa apakah val == "" (yang menunjukkan bahwa opsi Tidak Ada telah dipilih) dan kami mengurangi jumlah dari total serta menghapus sesi dengan nama yang dipilih.
Setelah ini masalah dimulai - pernyataan lain.
Lain - kami ingin memeriksa apakah fungsi isSession () dengan nama selektor kami mengembalikan 0 atau 1 - jika mengembalikan 0 maka kami menambahkan ke total nilai yang disimpan dalam atribut label, tetapi jika mengembalikan 1 - itu akan menyarankan sesi tersebut sudah ada - maka kami hanya mengubah nilai sesi ini dengan membuatnya kembali - tetapi jumlahnya tidak ditambahkan ke dalamnya.
Sekarang fungsi isSession terlihat seperti ini:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
return data;
},
error: function() {
alert('Error occured');
}
});
}
Sekarang - masalahnya adalah - saya tidak tahu apakah menggunakan "return" akan mengembalikan hasil dari fungsi - karena tampaknya tidak berhasil - namun, jika saya meletakkan "data" di bagian yang berhasil: waspada - tampaknya mengembalikan nilai yang benar.
Adakah yang tahu bagaimana mengembalikan nilai dari fungsi dan kemudian membandingkannya di pernyataan berikutnya?
Thanks guys - Saya sudah mencobanya dengan cara berikut:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
updateResult(data);
},
error: function() {
alert('Error occured');
}
});
}
lalu fungsi updateResult ():
function updateResult (data) {result = data; }
hasil - adalah variabel global - yang kemudian saya coba baca:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
isSession(name);
if(result == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
tetapi untuk beberapa alasan - tidak berhasil - ada ide?
Jawaban:
Masalahnya adalah Anda tidak dapat mengembalikan nilai dari panggilan asinkron, seperti permintaan AJAX, dan mengharapkannya berfungsi.
Alasannya adalah bahwa kode yang menunggu respons telah dieksekusi pada saat respons diterima.
Solusi untuk masalah ini adalah dengan menjalankan kode yang diperlukan di dalam
success:
callback. Dengan cara itu hanya mengaksesdata
ketika tersedia.Kemungkinan lain (yang secara efektif adalah hal yang sama) adalah memanggil fungsi di dalam
success:
callback Anda yang meneruskan data saat tersedia.sumber
async: false
). Dalam beberapa kasus, memiliki panggilan asinkron tidak diwajibkan. Lebih lanjut tentang jquery.ajax () doc api.jquery.com/jQuery.ajax , bukan ituAs of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated;
Ada banyak cara untuk mendapatkan respons jQuery AJAX. Saya berbagi dengan Anda dua pendekatan umum:
Pertama:
Kedua:
Anda dapat membuatnya sebesar yang Anda inginkan ...
sumber
ajaxObj['responseText']
tidak ada saat Anda menentukanvar ajaxResponse
Saya melihat jawabannya di sini dan meskipun membantu, mereka tidak persis seperti yang saya inginkan karena saya harus mengubah banyak kode saya.
Apa yang berhasil bagi saya adalah melakukan sesuatu seperti ini:
Harapan membantu seseorang
anakin
sumber
Meskipun semua pendekatan mengenai penggunaan
async: false
tidak baik karena penghentiannya dan halaman macet sampai permintaan kembali. Berikut adalah 2 cara untuk melakukannya:1st: Mengembalikan seluruh respons ajax dalam suatu fungsi dan kemudian menggunakan
done
fungsi untuk menangkap respons saat permintaan selesai. (DIREKOMENDASIKAN, CARA TERBAIK)HUBUNGI YANG DI ATAS SEPERTI:
UNTUK PANGGILAN GANDA AJAX MENGGUNAKAN
$.when
:2: Simpan respons dalam cookie dan kemudian di luar panggilan ajax dapatkan nilai cookie itu. (TIDAK DIANJURKAN)
CATATAN: Pada
jquery cookies
library exmple di atas digunakan, ini cukup ringan dan berfungsi sebagai snappy. Ini tautannya https://github.com/js-cookie/js-cookiesumber
Tambahkan
async: false
ke daftar atribut Anda. Ini memaksa utas javascript untuk menunggu sampai nilai yang dikembalikan diambil sebelum melanjutkan. Jelas, Anda tidak ingin melakukan ini dalam setiap keadaan, tetapi jika nilai diperlukan sebelum melanjutkan, ini akan berhasil.sumber
async: false
. Ini memblokir semua yang ada di halaman selama pengambilan. Anda tahu apa singkatan dari A di AJAX: Asynchronous. Jawaban yang tepat adalah OP perlu menggunakansuccess()
callback dengan benar.async: false
mengapa jQuery menerapkan opsi ini? jika saya tidak memuat data dalam jumlah besar ke halaman dan hanya menangani peristiwa pengguna, tidak masalah jika hal itu memblokir semua yang lain dalam waktu singkat untuk pengguna tersebut. tidak ada yang salah dan tidak ada yang buruk tentang itu. (jika digunakan dengan benar itu tidak akan memblokir apa pun karena dalam waktu itu tidak ada tindakan lain untuk pengguna tertentu yang akan terjadi)Ini sudah cukup tua, dan jelek, jangan lakukan ini. Anda harus menggunakan callback: https://stackoverflow.com/a/5316755/591257
Memiliki masalah yang sama, menyelesaikannya dengan cara ini, menggunakan var global. Tidak yakin apakah itu yang terbaik tapi pasti berhasil. Jika terjadi kesalahan, Anda mendapatkan string kosong (myVar = ''), sehingga Anda dapat menanganinya sesuai kebutuhan.
sumber
async: false
sini, karena dalam mode asynchronous tidak ada jaminan yangdata
disimpan kemyVar
sebelummyVar
dikembalikan.mungkin membantu, membuat fungsi panggilan ajax umum dan melampirkan fungsi yang memanggil ketika berhasil panggilan ajax, lihat contoh
sumber
Dengan Bantuan dari sini
Semoga ini sedikit membantu seseorang di suatu tempat.
sumber
async: false,
prasejarah dan tidak digunakan lagi sejak jQuery v1.8, Ini mungkin tidak akan membantu siapa punHai, coba async: false dalam panggilan ajax Anda ..
sumber