Apakah mungkin menyetel panggilan async: false ke $ .getJSON

105

Apakah mungkin untuk mengatur async: falsesaat memanggil $.getJSON()sehingga panggilan memblokir daripada menjadi asinkron?

ACP
sumber
1
Masukkan saja kode Anda ke panggilan balik .... Ada alasan mengapa ini tidak berlaku lagi - ini ide yang buruk
Milney
1
@Milney - Sangat aneh ... Secara resmi, ini tidak digunakan lagi; sebenarnya tidak . Jika benar-benar tidak digunakan lagi, kemungkinan untuk membuat panggilan sinkronisasi AJAX atau sakelar $ ajax.setup akan dihapus di jQuery 3. Faktanya, panggilan sinkronisasi terkadang sangat berguna, misalnya saat menginisialisasi global dengan Data JSON, jika Anda memiliki global lain yang mengandalkan batch pertama. (Mengemas seluruh proses inisialisasi dalam fungsi panggilan balik bisa jadi sangat rumit dalam keadaan tertentu.)
Brice Coustillas
Saya pikir permintaan Synchronous XHR atau kode Restrukturisasi akan menjawab kasus ini.
Chetabahana

Jawaban:

154

Anda perlu melakukan panggilan menggunakan $.ajax()itu secara sinkron, seperti ini:

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
    //...
  }
});

Ini akan cocok saat ini menggunakan $.getJSON()seperti ini:

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});
Nick Craver
sumber
23
Saya telah menemukan metode kenyamanan $ .getJSON () hampir tidak pernah berguna, dan selalu berakhir dengan menggunakan $ .ajax ().
Jacob Marble
dapatkah saya menggunakan ini untuk panggilan POST juga?
Hitesh
@hitesh ya, Anda juga akan menambahkan type: 'POST'opsi untuk mengubahnya menjadi posting - meskipun Anda tidak ingin menggunakannya async: falsekecuali Anda benar - benar perlu - itu akan mengunci UI.
Nick Craver
1
Apa yang dimaksud dengan 'myData' dalam kasus ini? Ketika saya menghapus data: myData sepenuhnya berfungsi .. Cukup baru untuk panggilan ajax!
nclsvh
2
Baru saja menemukan masalah baru berikut: "Synchronous XMLHttpRequest di luar pekerja sedang dalam proses dihapus dari platform web karena memiliki efek merugikan pada pengalaman pengguna akhir. (Ini adalah proses yang panjang yang memakan waktu bertahun-tahun.) Pengembang harus not pass false untuk argumen async ketika objek global objek pengaturan entri adalah objek Window. Agen pengguna sangat dianjurkan untuk memperingatkan tentang penggunaan seperti itu dalam alat pengembang dan dapat bereksperimen dengan melempar pengecualian InvalidAccessError saat itu terjadi. "
Ken Sharp
46

Kedua jawaban itu salah. Kamu bisa. Anda perlu menelepon

$.ajaxSetup({
async: false
});

sebelum panggilan json ajax Anda. Dan Anda dapat mengaturnya ke true setelah panggilan retuns (jika ada penggunaan ajax lain di halaman jika Anda ingin async)

velja
sumber
1
Saya baru saja membaca ulang bagian dokumen itu. Berikut adalah bagian yang berbicara tentang ajaxSetup: api.jquery.com/jQuery.ajaxSetup Dan berikut ini adalah opsinya: api.jquery.com/jQuery.ajax Jelas tertulis: "async Default: true Secara default, semua permintaan dikirim secara asinkron ( yaitu ini disetel ke true secara default). Jika Anda memerlukan permintaan sinkron, setel opsi ini ke false. Permintaan lintas domain dan permintaan dataType: "jsonp" tidak mendukung operasi sinkron. "JSONP bukan JSON jadi saya masih berpikir saya sejak awal. Saya akan menulis contoh nanti ketika saya punya waktu.
velja
7
Ini adalah komentar yang terlambat tapi ... manakah jawaban "keduanya" yang salah? Saya melihat jawaban dari @Nick Craver dapat diterima dan tidak "berantakan" dengan pengaturan AJAX global (jika permintaan lain diaktifkan pada saat yang sama)
scunliffe
1
Ini berfungsi, tetapi ini akan menerapkannya ke semua permintaan ajax yang Anda buat di halaman. Jadi saya akan downvote karena saya tidak akan merekomendasikannya
GabrielBB
3
Ini adalah jawaban berkualitas sangat rendah
Brian Webster
1
-1: Membuat hal-hal sinkron bisa mahal. Anda pasti harus melakukan ini per panggilan kecuali jika proyek Anda benar-benar membutuhkannya setiap saat. Jawaban Anda menyarankan bahwa Anda secara global mengkonfigurasi semua panggilan ke $.ajax(dan pembungkus singkatan berikutnya $.getJSON, misalnya $.get, dll.) Agar sinkron. Lebih lanjut, dokumentasi bahkan menyarankan untuk tidak menggunakan ini: "Deskripsi: Setel nilai default untuk permintaan Ajax di masa mendatang. Penggunaannya tidak disarankan."
Carrie Kendall
18

Saya pikir Anda berdua benar. Jawaban selanjutnya berfungsi dengan baik tetapi ini seperti menyetel opsi global sehingga Anda harus melakukan hal berikut:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });
webdev
sumber
10

Dalam kasus saya, Jay D benar. Saya harus menambahkan ini sebelum panggilan.

$.ajaxSetup({
    async: false
});

Dalam kode saya sebelumnya, saya memiliki ini:

var jsonData= (function() {
    var result;
    $.ajax({
        type:'GET',
        url:'data.txt',
        dataType:'json',
        async:false,
        success:function(data){
            result = data;
        }
    });
    return result;
})();
alert(JSON.stringify(jsonData));

Ia berhasil menemukan. Lalu saya ganti ke

var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

Lansiran tidak ditentukan.

Jika saya menambahkan ketiga baris tersebut, peringatan akan menampilkan data lagi.

$.ajaxSetup({
    async: false
});
var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));
ronrun
sumber
1

Jika Anda hanya perlu awaitmenghindari kode bersarang:

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));
k06a
sumber
0

Saya rasa Anda tidak dapat menyetel opsi itu di sana. Anda harus menggunakan jQuery.ajax () dengan parameter yang sesuai (pada dasarnya getJSON hanya membungkus panggilan itu ke dalam API yang lebih mudah, juga).

Daff
sumber
0

Gulung mis Anda sendiri

function syncJSON(i_url, callback) {
  $.ajax({
    type: "POST",
    async: false,
    url: i_url,
    contentType: "application/json",
    dataType: "json",
    success: function (msg) { callback(msg) },
    error: function (msg) { alert('error : ' + msg.d); }
  });
}

syncJSON("/pathToYourResouce", function (msg) {
   console.log(msg);
})
Stonedecroze
sumber