Czy można ustawić async: false
podczas wywoływania $.getJSON()
tak, aby wywołanie blokowało się, a nie było asynchroniczne?
Czy można ustawić async: false
podczas wywoływania $.getJSON()
tak, aby wywołanie blokowało się, a nie było asynchroniczne?
Odpowiedzi:
Musisz nawiązać połączenie, używając $.ajax()
do niego synchronicznie, na przykład:
$.ajax({
url: myUrl,
dataType: 'json',
async: false,
data: myData,
success: function(data) {
//stuff
//...
}
});
Pasowałoby to obecnie przy użyciu $.getJSON()
takiego:
$.getJSON(myUrl, myData, function(data) {
//stuff
//...
});
type: 'POST'
opcję, aby przekształcić go w post - chociaż nie chcesz go używać, async: false
chyba że naprawdę musisz - spowoduje to zablokowanie interfejsu użytkownika.
Obie odpowiedzi są błędne. Możesz. Musisz zadzwonić
$.ajaxSetup({
async: false
});
przed wywołaniem json ajax. I możesz ustawić to na true po ponownym wywołaniu połączenia (jeśli są inne zastosowania Ajax na stronie, jeśli chcesz, aby były asynchroniczne)
$.ajax
(z późniejszymi owijarki skrócone tj $.getJSON
, $.get
itp) jest synchroniczny. Ponadto dokumentacja sugeruje nawet, aby nie używać tego: „Opis: Ustaw wartości domyślne dla przyszłych żądań Ajax. Nie zaleca się jego używania”.
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));
To działa znaleźć. Potem zmieniam na
var jsonData= (function() {
var result;
$.getJSON('data.txt', {}, function(data){
result = data;
});
return result;
})();
alert(JSON.stringify(jsonData));
Alert jest niezdefiniowany.
Jeśli dodam te trzy linie, alert ponownie pokaże dane.
$.ajaxSetup({
async: false
});
var jsonData= (function() {
var result;
$.getJSON('data.txt', {}, function(data){
result = data;
});
return result;
})();
alert(JSON.stringify(jsonData));
Myślę, że nie można tam ustawić tej opcji. Będziesz musiał użyć jQuery.ajax () z odpowiednimi parametrami (w zasadzie getJSON po prostu opakowuje to wywołanie w łatwiejsze API).
Zroluj własny 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);
})