Saya memiliki widget JavaScript yang menyediakan titik ekstensi standar. Salah satunya adalah beforecreate
fungsinya. Itu harus kembali false
untuk mencegah barang tidak dibuat.
Saya telah menambahkan panggilan Ajax ke fungsi ini menggunakan jQuery:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Tapi saya ingin mencegah widget saya membuat item, jadi saya harus kembali false
pada fungsi ibu, bukan di callback. Apakah ada cara untuk melakukan permintaan AJAX sinkron menggunakan jQuery atau API di browser lainnya?
javascript
jquery
ajax
asynchronous
Artem Tikhomirov
sumber
sumber
beforecreate
.Jawaban:
Dari dokumentasi jQuery : Anda menentukan opsi asynchronous menjadi false untuk mendapatkan permintaan Ajax yang sinkron. Kemudian panggilan balik Anda dapat mengatur beberapa data sebelum fungsi ibumu berlanjut.
Ini akan terlihat seperti apa kode Anda jika diubah seperti yang disarankan:
sumber
async: false
masih didukung di jQuery> = 1.8. Kemampuan untuk digunakanasync: false
dengan jqXHR ($.Deferred
) adalah apa yang sudah usang. Dengan kata lain, seseorang harus menggunakan opsi keberhasilan / kesalahan / panggilan balik yang lebih baru, daripada metode sebelumnya, misalnyajqXHR.done()
,.Anda dapat menempatkan pengaturan Ajax jQuery dalam mode sinkron dengan memanggil
Dan kemudian lakukan panggilan Ajax Anda menggunakan
jQuery.get( ... );
Kemudian cukup nyalakan sekali lagi
Saya kira itu bekerja sama dengan yang disarankan oleh @Adam, tetapi mungkin bermanfaat bagi seseorang yang ingin mengkonfigurasi ulang
jQuery.get()
atau sintaks yangjQuery.post()
lebih rumitjQuery.ajax()
.sumber
$.ajax()
". ;)Solusi yang sangat baik! Saya perhatikan ketika saya mencoba menerapkannya bahwa jika saya mengembalikan nilai dalam klausa keberhasilan, itu kembali sebagai tidak terdefinisi. Saya harus menyimpannya dalam variabel dan mengembalikan variabel itu. Ini adalah metode yang saya buat:
sumber
getWhatever
. Jadi Anda tidak mengembalikan apa pun yaituundefined
dari AndagetWhatever
.Semua jawaban ini kehilangan titik bahwa melakukan panggilan Ajax dengan async: false akan menyebabkan browser hang sampai permintaan Ajax selesai. Menggunakan pustaka kontrol aliran akan menyelesaikan masalah ini tanpa menutup browser. Berikut ini adalah contoh dengan Frame.js :
sumber
sumber
getURL
vsget
? Mengapa kita menggantung browser saya?" dllCatatan: Anda tidak boleh menggunakan
async: false
karena pesan peringatan ini:Chrome bahkan memperingatkan tentang hal ini di konsol:
Ini dapat merusak halaman Anda jika Anda melakukan sesuatu seperti ini karena itu bisa berhenti bekerja setiap hari.
Jika Anda ingin melakukannya dengan cara yang masih terasa seperti itu sinkron tetapi masih tidak memblokir maka Anda harus menggunakan async / tunggu dan mungkin juga beberapa ajax yang didasarkan pada janji-janji seperti yang baru Ambil API baru
Sunting chrome bekerja pada Menonaktifkan sinkronisasi XHR dalam pemecatan halaman saat halaman sedang dinavigasi atau ditutup oleh pengguna. Ini melibatkan sebelumunload, unload, menyembunyikan halaman dan perubahan visibilitas.
jika ini adalah use case Anda maka Anda mungkin ingin melihat navigator.sendBeacon sebagai gantinya
Dimungkinkan juga untuk menonaktifkan req sinkronisasi dengan header http atau atribut iframe yang memungkinkan
sumber
await fetch(url)
panggilan Anda ditry... catch
blok untuk menangkap kesalahan asinkron.async
di awal, jadi Anda bisa melakukannyafoo().catch(...)
untuk menangkapnya jugabeforeunload
tetapi kemudian mengembalikan perubahan setelah umpan balik negatif bugs.chromium.org/p/chromium/issues/detail?id=952452Perlu diingat bahwa jika Anda melakukan panggilan Ajax lintas-domain (dengan menggunakan JSONP ) - Anda tidak dapat melakukannya secara sinkron,
async
bendera akan diabaikan oleh jQuery.Untuk panggilan JSONP Anda bisa menggunakan:
sumber
Dengan
async: false
Anda mendapatkan sendiri browser yang diblokir. Untuk solusi sinkron yang tidak menghalangi Anda dapat menggunakan yang berikut:ES6 / ECMAScript2015
Dengan ES6 Anda dapat menggunakan generator & perpustakaan bersama :
ES7
Dengan ES7 Anda bisa menggunakan asyc menunggu:
sumber
async function
menjadi bereecreatebeforecreate: async function(....
dan menghapus fungsi async yang dipanggil sendiriSaya menggunakan jawaban yang diberikan oleh Carcione dan memodifikasinya untuk menggunakan JSON.
Saya menambahkan dataType dari 'JSON' dan mengubah .responseText untuk responseJSON .
Saya juga mengambil status menggunakan properti statusText dari objek yang dikembalikan. Perhatikan, bahwa ini adalah status respons Ajax, bukan apakah JSON valid.
Bagian belakang harus mengembalikan respons dalam JSON yang benar (terbentuk dengan baik), jika tidak objek yang dikembalikan akan tidak terdefinisi.
Ada dua aspek yang harus dipertimbangkan ketika menjawab pertanyaan awal. Seseorang memberitahu Ajax untuk melakukan secara sinkron (dengan mengatur async: false ) dan yang lainnya mengembalikan respons melalui pernyataan pengembalian fungsi panggilan, alih-alih menjadi fungsi panggilan balik.
Saya juga mencobanya dengan POST dan berhasil.
Saya mengubah GET menjadi POST dan menambahkan data: postdata
Perhatikan bahwa kode di atas hanya bekerja dalam kasus di mana async adalah palsu . Jika Anda menetapkan async: true objek yang dikembalikan jqxhr tidak akan valid pada saat panggilan AJAX kembali, hanya nanti ketika panggilan asinkron telah selesai, tetapi itu terlalu terlambat untuk mengatur variabel respons .
sumber
Ini adalah contoh:
sumber
async false
dengan solusi berbasis janji. Ini hanya mengunci browser tanpa manfaat sama sekali.ajax
panggilan yang sudah kembali) dan.then()
ataudone()
(seperti yang sudah ditunjukkan). Mengunci browser adalah pengalaman pengguna yang sangat buruk. Seperti yang saya katakan memilikiasync: false
dalam contoh ini adalah buang-buang waktu.Pertama-tama kita harus mengerti kapan kita menggunakan $ .ajax dan kapan kita menggunakan $ .get / $. Post
Ketika kita membutuhkan kontrol level rendah atas permintaan ajax seperti pengaturan header permintaan, pengaturan caching, pengaturan sinkron dll. Maka kita harus mencari $ .ajax.
$ .get / $. post: Ketika kita tidak memerlukan kontrol level rendah atas permintaan ajax. Hanya sederhana dapatkan / posting data ke server. Ini adalah singkatan
dan karenanya kami tidak dapat menggunakan fitur lain (sinkronisasi, cache, dll.) dengan $ .get / $. post.
Karenanya untuk kontrol level rendah (sinkronisasi, cache, dll.) Atas permintaan ajax, kita harus menggunakan $ .ajax
sumber
ini adalah implementasi sederhana saya untuk permintaan ASYNC dengan jQuery. Saya harap ini membantu siapa pun.
sumber
Karena
XMLHttpReponse
operasi sinkron sudah usang saya datang dengan solusi berikut yang membungkusXMLHttpRequest
. Ini memungkinkan permintaan AJAX yang dipesan sementara masih bersifat asiknron, yang sangat berguna untuk token CSRF sekali pakai.Ini juga transparan sehingga perpustakaan seperti jQuery akan beroperasi dengan lancar.
sumber
Karena pertanyaan aslinya adalah tentang
jQuery.get
, perlu disebutkan di sini bahwa (seperti yang disebutkan di sini ) orang dapat menggunakanasync: false
dalam$.get()
tetapi idealnya menghindarinya karena asinkronXMLHTTPRequest
sudah usang (dan browser dapat memberikan peringatan):sumber
Setel
asyn:false
dalam permintaan ajax untuk membuatnya sinkron.Berikut ini contoh kode:
Ini dapat membuat layar tidak responsif.
sumber