Saya memiliki fungsi sisi server yang memerlukan login. Jika pengguna masuk fungsi akan mengembalikan 1 pada keberhasilan. Jika tidak, fungsi akan mengembalikan halaman login.
Saya ingin memanggil fungsi menggunakan Ajax dan jQuery. Apa yang saya lakukan adalah mengirimkan permintaan dengan tautan biasa, dengan fungsi klik diterapkan di sana. Jika pengguna tidak masuk atau fungsi gagal, saya ingin panggilan Ajax kembali benar, sehingga href memicu.
Namun, ketika saya menggunakan kode berikut, fungsi keluar sebelum panggilan Ajax selesai.
Bagaimana saya bisa mengarahkan pengguna dengan anggun ke halaman login?
$(".my_link").click(
function(){
$.ajax({
url: $(this).attr('href'),
type: 'GET',
cache: false,
timeout: 30000,
error: function(){
return true;
},
success: function(msg){
if (parseFloat(msg)){
return false;
} else {
return true;
}
}
});
});
Jawaban:
Jika Anda tidak ingin
$.ajax()
fungsi kembali dengan segera, aturasync
opsi kefalse
:Tapi, saya akan mencatat bahwa ini akan bertentangan dengan titik AJAX. Selain itu, Anda harus menangani respons dalam
error
dansuccess
fungsi. Fungsi-fungsi itu hanya akan dipanggil ketika respons diterima dari server.sumber
async: false
. Perulangan acara browser akan hang saat menunggu di I / O jaringan yang tidak dapat diandalkan. Selalu ada cara yang lebih baik. Dalam hal ini, target tautan dapat memverifikasi sesi pengguna dan 302 ke halaman login.async: false
bisa sangat bermanfaat.async
dengan nilaifalse
sudah usang dalam sebagian besar kasus penggunaan browser. Itu bisa melempar pengecualian di versi browser yang lebih baru. Lihat xhr.spec.whatwg.org/#sync-warning (berlaku untukasync
parameteropen
metode xhr , yang menggunakan jQuery).Saya tidak menggunakan
$.ajax
tetapi fungsi$.post
dan$.get
, jadi jika saya harus menunggu jawaban, saya menggunakan ini:sumber
Objek XMLHttpRequest yang mendasarinya (digunakan oleh jQuery untuk mengajukan permintaan) mendukung properti asinkron. Setel ke false . Suka
sumber
Alih-alih mengatur async ke false yang biasanya merupakan desain yang buruk, Anda mungkin ingin mempertimbangkan untuk memblokir UI saat operasi menunggu.
Ini dapat dicapai dengan baik dengan janji-janji jQuery sebagai berikut:
dengan ini sekarang Anda dapat melakukan:
Dan UI akan memblokir sampai perintah ajax kembali
lihat jsfiddle
sumber
Saya pikir semuanya akan lebih mudah jika Anda memberi kode
success
fungsi Anda untuk memuat halaman yang sesuai daripada mengembalikantrue
ataufalse
.Misalnya, alih-alih kembali,
true
Anda dapat melakukan:Dengan begitu ketika fungsi sukses disebut halaman akan dialihkan.
sumber
Di JS modern Anda cukup menggunakan
async
/await
, seperti:Kemudian menyebutnya dalam suatu
async
fungsi seperti:sumber
async
fungsi".Karena saya tidak melihatnya disebutkan di sini saya pikir saya juga akan menunjukkan bahwa jQuery kapan bisa sangat berguna untuk tujuan ini.
Contoh mereka terlihat seperti ini:
Bagian "then" tidak akan dieksekusi sampai bagian "kapan" selesai.
sumber
Itu harus menunggu sampai permintaan selesai. Setelah itu saya akan kembali mendapatkan request body dari mana fungsi dipanggil.
sumber