2010-05-04 5 views
96

Czy jest możliwe ustawienie async: false podczas wywoływania $.getJSON(), aby połączenie blokowało zamiast być asynchroniczne?

+1

Wystarczy umieścić swój kod w zwrotnego .... Jest powód, to jest przestarzałe - to zły pomysł – Milney

+0

@Milney - Bardzo dziwne ... Oficjalnie _jest_ przestarzałe; w rzeczywistości jest _nie_. Jeśli byłby naprawdę przestarzały, możliwość wywołania synchronizacji wywołania AJAX lub przełącznika $ ajax.setup zostałaby pominięta w jQuery 3. W rzeczywistości wywołanie synchronizacji okazuje się czasami bardzo przydatne, na przykład po zainicjowaniu globali z Dane JSON, gdy masz inne globale, które opierają się na pierwszej partii. (Pakowanie całego procesu inicjowania w funkcję wywołania zwrotnego może być bardzo trudne w pewnych okolicznościach.) –

Odpowiedz

142

trzeba wykonać połączenie przy użyciu $.ajax() niej synchronicznie, tak:

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

To będzie pasować aktualnie wykorzystuje $.getJSON() tak:

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

Znalazłem wygodną metodę $ .getJSON(), która prawie nigdy nie była przydatna i zawsze kończy się na użyciu $ .ajax(). –

+0

Czy mogę użyć tego również do połączenia POST? – Hitesh

+0

@hitesh tak, dodaj opcję 'type: 'POST'', aby zamienić ją w post - choć nie chcesz używać' async: false', chyba że * naprawdę * musisz - to Zablokuję interfejs użytkownika. –

0

Nie sądzę, że można tam ustawić tę opcję. Będziesz musiał użyć jQuery.ajax() z odpowiednimi parametrami (zasadniczo getJSON po prostu owija to połączenie w łatwiejszy interfejs API).

45

Obie odpowiedzi są błędne. Możesz. Trzeba zadzwonić

$.ajaxSetup({ 
async: false 
}); 

przed wywołania ajax json. I możesz ustawić go na true po wywołaniu retunów (jeśli są inne zastosowania ajax na stronie, jeśli chcesz je asynchronicznie)

+0

Dokumentacja jquery mówi inaczej. –

+3

Czy możesz wskazać mi, żebym się rozdzielił, skoro mówi inaczej? – velja

+1

Właśnie przeczytałem tę część dokumentacji. Oto część, która mówi o ajaxSetup: http://api.jquery.com/jQuery.ajaxSetup/ A oto opcje: http://api.jquery.com/jQuery.ajax/ Wyraźnie mówi: "async Domyślnie: true Domyślnie wszystkie żądania są wysyłane asynchronicznie (to jest domyślnie ustawione na true) Jeśli potrzebujesz synchronicznych żądań, ustaw tę opcję na false Żądania międzydomenowe i dataType:" jsonp " żądania nie obsługują operacji synchronicznej. " JSONP nie jest JSON, więc nadal uważam, że mam rację od samego początku. Piszę przykład później, gdy dostanę trochę czasu. – velja

16

Myślę, że oboje macie rację. Im później odpowiedź działa dobrze, ale jego jak ustawienie opcji globalnej więc trzeba wykonać następujące czynności:

$.ajaxSetup({ 
     async: false 
    }); 

    //ajax call here 

    $.ajaxSetup({ 
     async: true 
    }); 
0

przewróceniu własne np

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

W moim przypadku Jay D ma rację. Muszę to dodać przed rozmową.

$.ajaxSetup({ 
    async: false 
}); 

W moim poprzednim kodzie, mam to:

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

Działa znaleźć. Następnie zmienię na

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

Alert jest niezdefiniowany.

Po dodaniu tych trzech linii alert ponownie wyświetli dane.

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