Async: false değerini $ .getJSON çağrısına ayarlamak mümkün mü


105

O ayarlamak mümkün mü async: falseçağrılırken $.getJSON()çağrı blokları yerine asenkron olmak o kadar?


1
Kodunuzu geri
aramaya

1
@Milney - Çok garip ... Resmi olarak bir itiraz; aslında öyle değil . Gerçekten kullanımdan kaldırılmış olsaydı, jQuery 3'te bir sync AJAX çağrısı veya bir $ ajax.setup anahtarı yapma olasılığı bırakılırdı. Aslına bakılırsa, bir senkronizasyon çağrısı bazen çok kullanışlıdır, örneğin globalleri ile JSON verileri, ilk partiye dayanan başka globallere sahip olduğunuzda. (Geri arama işlevinde tüm başlatma sürecini paketlemek, belirli koşullar altında çok zor olabilir.)
Brice Coustillas

Eşzamanlı XHR istekleri veya Yeniden Yapılandırma kodunun bu durumu yanıtlayacağını düşünüyorum .
Chetabahana

Yanıtlar:


154

Çağrıyı $.ajax()şu şekilde eşzamanlı olarak yapmanız gerekir :

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

Bu, şu anda şu şekilde eşleşir $.getJSON():

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});

23
$ .GetJSON () kolaylık yöntemini neredeyse hiç yararlı bulmadım ve her zaman $ .ajax () kullanmaya başladım.
Jacob Marble

bunu POST araması için de kullanabilir miyim?
Hitesh

@hitesh evet, bunu bir gönderiye dönüştürmek için bir type: 'POST'seçenek de eklersiniz - ancak gerçekten ihtiyacınız async: falseolmadıkça kullanmak istemezsiniz - kullanıcı arayüzünü kilitler.
Nick Craver

1
Bu durumda 'Verilerim' nedir? Verileri sildiğimde: myData tamamen çalışıyor .. Ajax çağrıları için oldukça yeni!
nclsvh

2
Şu yeni problemle karşılaştım: "Çalışanlar dışındaki senkronize XMLHttpRequest, son kullanıcının deneyimine zararlı etkileri olduğu için web platformundan kaldırılma sürecindedir. (Bu, uzun yıllar alan uzun bir süreçtir.) Geliştiriciler gerekir. giriş ayarları nesnesinin genel nesnesi bir Window nesnesi olduğunda zaman uyumsuz bağımsız değişken için false değerini geçmez. Kullanıcı aracılarının, geliştirici araçlarında bu tür kullanım hakkında uyarıda bulunmaları şiddetle tavsiye edilir ve bu gerçekleştiğinde bir InvalidAccessError istisnası atmayı deneyebilirler. "
Ken Sharp

46

Her iki cevap da yanlış. Yapabilirsin. Araman gerek

$.ajaxSetup({
async: false
});

json ajax aramanızdan önce. Ve çağrı yeniden çalıştırmalarından sonra bunu true olarak ayarlayabilirsiniz (sayfada ajax'ın başka kullanımları varsa, asenkron olmasını istiyorsanız)


1
Dokümanların o kısmını yeniden okudum. İşte ajaxSetup hakkında konuşan kısım: api.jquery.com/jQuery.ajaxSetup Ve işte seçenekler: api.jquery.com/jQuery.ajax Açıkça şöyle diyor: "async Default: true Varsayılan olarak, tüm istekler eşzamansız olarak gönderilir ( yani bu, varsayılan olarak true olarak ayarlanmıştır). Eşzamanlı isteklere ihtiyacınız varsa, bu seçeneği false olarak ayarlayın. Alanlar arası istekler ve dataType: "jsonp" istekleri eşzamanlı işlemi desteklemiyor. "JSONP, JSON değil, bu yüzden hala benim en başından beri. Daha sonra biraz zamanım olduğunda örnek yazacağım.
velja

7
Bu geç bir yorum ama ... yanlış olan "her ikisi" de hangileri? @Nick Craver'ın yanıtının hem kabul edilebilir olduğunu hem de genel AJAX ayarlarıyla "karışıklık" olmadığını görüyorum (diğer istekler aynı anda tetikleniyorsa)
scunliffe

1
Çalışır, ancak bu, sayfada yaptığınız tüm ajax istekleri için geçerlidir. Bu yüzden tavsiye etmeyeceğim için olumsuz oy vereceğim
GabrielBB

3
Bu çok düşük kaliteli bir cevap
Brian Webster 15

1
-1: Eşzamanlı yapmak maliyetli olabilir. Projeniz her seferinde kesinlikle gerektirmedikçe, bunu kesinlikle arama başına yapmalısınız. Cevabınız Eğer global tüm çağrıları yapılandırmak düşündürmektedir $.ajax(ve sonraki stenografi sarmalayıcıları yani $.getJSON, $.getvb) senkron olması. Dahası, belgeler bunu kullanmamayı bile öneriyor: "Açıklama: Gelecekteki Ajax istekleri için varsayılan değerleri ayarlayın. Kullanımı önerilmez."
Carrie Kendall

18

Bence ikiniz de haklısınız. Sonraki cevap iyi çalışıyor, ancak küresel bir seçenek belirlemeye benziyor, böylece aşağıdakileri yapmanız gerekiyor:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

Benim durumumda Jay D haklı. Bunu aramadan önce eklemeliyim.

$.ajaxSetup({
    async: false
});

Önceki kodumda şu var:

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));

Çalışır bul. Sonra değiştim

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

Uyarı tanımsız.

Bu üç satırı eklersem, uyarı verileri tekrar gösterir.

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

1

Yalnızca awaitkod iç içe geçmekten kaçınmanız gerekiyorsa :

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

0

O seçeneği orada ayarlayabileceğinizi sanmıyorum. JQuery.ajax () ' ı uygun parametrelerle kullanmanız gerekecek ( temelde getJSON bu çağrıyı daha kolay bir API'ye sarar).


0

Kendi örneğinizi atın

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);
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.