Tengo un widget de JavaScript que proporciona puntos de extensión estándar. Uno de ellos es la función beforecreate
. Debería devolver false
para evitar que se cree un elemento.
He añadido una llamada Ajax a esta función usando jQuery:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Pero quiero evitar que mi widget cree el elemento, por lo que debería devolver false
en la función madre, no en la llamada de retorno. ¿Hay alguna forma de realizar una petición AJAX sincrónica utilizando jQuery o cualquier otra API del navegador?
De la documentación de jQuery: se especifica que la opción asíncrona sea false para obtener una petición Ajax sincrónica. Entonces tu callback puede establecer algunos datos antes de que tu función madre proceda.
Este es el aspecto de tu código si se cambia como se sugiere:
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
Puedes poner la configuración Ajax de jQuery en modo síncrono llamando a
jQuery.ajaxSetup({async:false});
Y luego realizar tus llamadas Ajax usando jQuery.get( ... );
Luego sólo hay que volver a activarlo una vez
jQuery.ajaxSetup({async:true});
Supongo que funciona lo mismo que sugiere @Adam, pero podría ser útil para alguien que quiera reconfigurar su jQuery.get()
o jQuery.post()
a la sintaxis más elaborada de jQuery.ajax()
.
Excelente solución. Me di cuenta cuando traté de implementarla que si devolvía un valor en la cláusula de éxito, volvía como indefinido. Tuve que almacenarlo en una variable y devolver esa variable. Este es el método que se me ocurrió:
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl = "", strReturn = "";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}