2010-05-04 23 views
96

¿Es posible establecer async: false al llamar al $.getJSON() para que la llamada bloquee en lugar de ser asincrónica?

+1

Sólo hay que poner el código en la devolución de llamada .... Hay una razón de que esto está en desuso - es una mala idea – Milney

+0

@Milney - Muy extraño ... Oficialmente, _es_ obsoleto; de hecho, es _no_. Si fuera realmente obsoleto, la posibilidad de hacer una llamada AJAX sincronizada o un conmutador $ ajax.setup se habría eliminado en jQuery 3. De hecho, una llamada de sincronización es de vez en cuando muy útil, por ejemplo al inicializar globales con Datos JSON, cuando tienes otros globales que dependen del primer lote. (El empaquetado de todo el proceso de inicialización en la función de devolución de llamada podría ser muy complicado en determinadas circunstancias). –

Respuesta

142

Usted necesita para realizar la llamada utilizando $.ajax() a ella de forma sincrónica, así:

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

ello se compararán usando actualmente $.getJSON() así:

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

He encontrado que el método de conveniencia $ .getJSON() casi nunca es útil y siempre termina usando $ .ajax(). –

+0

¿Puedo usar esto para la llamada POST también? – Hitesh

+0

@hitesh Sí, agregaría una opción 'tipo: 'POST'' también para convertirla en una publicación, aunque no desea usar' async: false' a menos que * realmente * necesite hacerlo Bloqueará la interfaz de usuario. –

0

No creo que pueda establecer esa opción allí. Tendrá que usar jQuery.ajax() con los parámetros apropiados (básicamente getJSON también ajusta esa llamada a una API más sencilla).

45

Ambas respuestas son incorrectas. Puedes. Es necesario llamar

$.ajaxSetup({ 
async: false 
}); 

antes de que su llamada AJAX JSON. Y puede configurarlo en true después de volver a llamar (si hay otros usos de ajax en la página si lo quiere asíncrono)

+0

Los documentos de jquery dicen lo contrario. –

+3

¿Puede indicarme parte en donde dice lo contrario? – velja

+1

Acabo de volver a leer esa parte de los documentos. Aquí está la parte que habla sobre ajaxSetup: http://api.jquery.com/jQuery.ajaxSetup/ Y estas son las opciones: http://api.jquery.com/jQuery.ajax/ Dice claramente: "async Predeterminado: true De manera predeterminada, todas las solicitudes se envían de forma asíncrona (es decir, se establece de manera predeterminada). Si necesita solicitudes sincrónicas, establezca esta opción en falso. Solicitudes entre dominios y tipo de datos:" jsonp " las solicitudes no son compatibles con la operación síncrona. " JSONP no es JSON, así que todavía creo que estoy en lo cierto desde el principio. Escribiré un ejemplo más adelante cuando tenga algo de tiempo. – velja

16

Creo que ambos tienen razón. La respuesta más adelante funciona bien, pero es como el establecimiento de una opción global por lo que tiene que hacer lo siguiente:

$.ajaxSetup({ 
     async: false 
    }); 

    //ajax call here 

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

liar por ejemplo,

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

En mi caso, Jay D tiene razón. Tengo que agregar esto antes de la llamada.

$.ajaxSetup({ 
    async: false 
}); 

En mi código anterior, tengo unas pocas cosas:

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 Encuentra. Luego cambio a

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

La alerta no está definida.

Si agrego esas tres líneas, la alerta muestra nuevamente los datos.

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