É possível definir async: false
ao chamar $.getJSON()
para que a chamada seja bloqueada em vez de ser assíncrona?
É possível definir async: false
ao chamar $.getJSON()
para que a chamada seja bloqueada em vez de ser assíncrona?
Respostas:
Você precisa fazer a chamada usando $.ajax()
para ele de forma síncrona, assim:
$.ajax({
url: myUrl,
dataType: 'json',
async: false,
data: myData,
success: function(data) {
//stuff
//...
}
});
Isso corresponderia ao uso atual $.getJSON()
desta forma:
$.getJSON(myUrl, myData, function(data) {
//stuff
//...
});
type: 'POST'
opção para transformá-lo em um post - embora você não queira usar a async: false
menos que realmente precise - ele bloqueará a IU.
Ambas as respostas estão erradas. Você pode. Você precisa ligar
$.ajaxSetup({
async: false
});
antes de sua chamada json ajax. E você pode definir como verdadeiro após a retomada da chamada (se houver outros usos de ajax na página, se você quiser que sejam assíncronos)
$.ajax
(e wrappers abreviados subsequentes $.getJSON
, ou seja $.get
, etc.) para serem síncronas. Além disso, a documentação sugere até mesmo não usar isso: "Descrição: Definir valores padrão para solicitações futuras do Ajax. Seu uso não é recomendado."
No meu caso, Jay D está certo. Eu tenho que adicionar isso antes da chamada.
$.ajaxSetup({
async: false
});
Em meu código anterior, eu tenho este:
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));
Funciona encontrar. Então eu mudo para
var jsonData= (function() {
var result;
$.getJSON('data.txt', {}, function(data){
result = data;
});
return result;
})();
alert(JSON.stringify(jsonData));
O alerta é indefinido.
Se eu adicionar essas três linhas, o alerta mostra os dados novamente.
$.ajaxSetup({
async: false
});
var jsonData= (function() {
var result;
$.getJSON('data.txt', {}, function(data){
result = data;
});
return result;
})();
alert(JSON.stringify(jsonData));
Eu não acho que você pode definir essa opção lá. Você terá que usar jQuery.ajax () com os parâmetros apropriados (basicamente getJSON apenas envolve essa chamada em uma API mais fácil, também).
Role o seu próprio, por exemplo
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);
})