JQuery.ajax () içinde “async: false” ne yapar?


257

Özellikle, varsayılandan ( async: true) farkı nedir?

Hangi durumlarda ben açık kümesi isteyeyim asynciçin falseve ateş gelen sayfadaki diğer olayları önlemede bir ilgisi var mı?



Evet, bana göre eğer asenkron değilse "Ajax" (Asenkron JavaScript ve XML) dışında bir şey
denmelidir

Asenkron, komut dosyasının sunucuya bir istek göndereceği ve yanıtı beklemeden yürütülmesine devam edeceği anlamına gelir. Yanıt alınır alınmaz bir tarayıcı olayı tetiklenir ve bu da komut dosyasının ilişkili eylemleri yürütmesine izin verir.
SagarPPanchal

Yanıtlar:


300

Sayfadaki diğer etkinliklerin tetiklenmesini önlemekle bir ilgisi var mı?

Evet.

Zaman uyumsuzluğunu false olarak ayarlamak, çağırdığınız ifadenin işlevinizdeki bir sonraki ifadenin çağrılmasından önce tamamlanması gerektiği anlamına gelir. Async: true değerini ayarlarsanız, bu ifade yürütmeye başlar ve async ifadesinin henüz tamamlanıp tamamlanmadığına bakılmaksızın bir sonraki ifade çağrılır.

Daha fazla bilgi için bkz: jQuery ajax başarı anonim işlev kapsamı


12
JavaScript'in işlenmediği için bunun nasıl yapıldığını hep merak ettim.
Matt

4
@ L.DeLeo - hayır, hiç de değil - ertelemeler asenkron işlev çağrılarının karmaşıklığını yönetmenin başka bir yoludur - async: false asenkroniteyi çağrıdan tamamen kaldırır . Çağrı ajax blokları - Sunucu yanıt verdi kadar yürütülmez aşağıdaki kodu.
Sean Vieira

14
Bunun, ajax yürütülürken tarayıcının hiçbir olayı yakalamayacağı / tetiklemeyeceği anlamına geldiğini unutmayın. Bunu zor yoldan öğrendim, Firefox'un neden bir tıklama etkinliğini tetiklemediğini anlamaya çalışıyorum. Bunun nedeni, aşağıdaki senkronizasyon çağrısını engelleyen "zorunlu" bir bulanıklık olayı olduğu ortaya çıktı.
PålOliver

3
@Matt hayır o (^^ artık) değil w3schools.com/html/html5_webworkers.asp
borrel

5
async: falseÖlü gibi görünüyor , denedim ve aldım18:17:49.384 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/ 1 jquery.js:9061:4
Aba

120
  • async:false= Kod duraklatıldı . (Bunun bitmesini bekleyen diğer kodlar .)
  • async:true= Kod devam etti . (Hiçbir şey duraklatılmaz. Diğer kod beklemiyor .)

Bu kadar basit.


Oldukça genel "kodun geri kalanı", duraklatılmış kod kapsamını açıklar.
bart

26

Async:Falsedinlenme kodunun yürütülmesini tutar. Ajax yanıtını aldıktan sonra, kodun geri kalanı yürütülür.


18

Eşzamansız alımı devre dışı bırakırsanız, komut dosyanız istek yerine getirilene kadar engellenir. Bilinen bir sırayla bazı istek dizilerini gerçekleştirmek için kullanışlıdır, ancak asenkron geri aramaların daha temiz olduğunu düşünüyorum.


Joe: Arka planda çalışan iş parçacığı olup olmadığına bağlı.
John Millikin

10

Bir kullanım durumu, ajaxkullanıcı pencereyi kapatmadan veya sayfadan ayrılmadan önce arama yapmaktır . Bu, kullanıcı başka bir siteye geçmeden veya tarayıcıyı kapatmadan önce veritabanındaki bazı geçici kayıtları silmek gibi bir şeydir.

 $(window).unload(
        function(){
            $.ajax({
            url: 'your url',
            global: false,
            type: 'POST',
            data: {},
            async: false, //blocks window close
            success: function() {}
        });
    });

51
Hiçbir miktar tarayıcı penceresinin kapanmasını durduramaz
jammykam

Tamamen ilgisiz bir şey için async false gerekiyordu, ancak komutumun sayfada tanımsız olarak doldurmadan önce bir xml dosyasından bir değer almasına izin verdiği için sorunumu çözdü.
J_L

8

itibaren

https://xhr.spec.whatwg.org/#synchronous-flag

Eşzamanlı XMLHttpRequest, işçilerin dışındaki son kullanıcının deneyimine zararlı etkileri olduğu için web platformundan kaldırılma sürecindedir. (Bu uzun yıllar süren uzun bir süreçtir.) JavaScript genel ortamı bir belge ortamı olduğunda geliştiriciler zaman uyumsuz argüman için yanlış iletmemelidir. Kullanıcı aracıları, geliştirici araçlarında bu tür kullanım konusunda uyarmaya şiddetle teşvik edilir ve gerçekleştiğinde bir InvalidAccessError istisnası atmayı deneyebilir. Gelecekteki yön, yalnızca çalışan iş parçacıklarında XMLHttpRequest öğelerine izin vermektir. Mesajın bu konuda bir uyarı olması amaçlanmıştır.


8

Zaman uyumsuzluğunu false olarak ayarlamak, ajax isteğini izleyen talimatların, isteğin tamamlanmasını beklemesi gerektiği anlamına gelir. Aşağıda, kodun düzgün çalışması için async değerini false olarak ayarlamak zorunda olduğunuz bir durum vardır.

var phpData = (function get_php_data() {
  var php_data;
  $.ajax({
    url: "http://somesite/v1/api/get_php_data",
    async: false, 
    //very important: else php_data will be returned even before we get Json from the url
    dataType: 'json',
    success: function (json) {
      php_data = json;
    }
  });
  return php_data;
})();

Yukarıdaki örnek, zaman uyumsuzluğun kullanımını açıkça açıklamaktadır : false

False olarak ayarlayarak, verilerin url'den alındıktan sonra yalnızca bu php_data döndürmesinden sonra emin olduk; denir


Başka birinin benimle aynı sorunu olması durumunda: Bu cevap, return php_dataifadenin başarı işlevinde olamayacağını, ancak $.ajax()işlevin dışında olması gerektiğini vurgular . Ben eşdeğer return php_dataiç içine koymuştu success: function(){}ve her zaman undefined dönüyordu
gordon613
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.