Eu tenho um widget JavaScript que fornece pontos de extensão padrão. Um deles é a função "antes da criação". Ela deve retornar false
para evitar que um item seja criado.
I'adicionei uma chamada Ajax a esta função 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);
});
}
Mas eu quero evitar que meu widget crie o item, então eu devo retornar falso
na função-mãe, não na ligação de retorno. Existe uma maneira de executar uma requisição AJAX síncrona utilizando jQuery ou qualquer outra API in-browser?
A partir da documentação jQuery: você especifica a opção asíncrona para ser **falsa*** para obter uma requisição Ajax síncrona. Depois a sua chamada de retorno pode definir alguns dados antes da função da sua mãe prosseguir.
Aqui's como seu código ficaria se fosse alterado conforme sugerido:
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
});
}
Você pode colocar a configuração jQuery's Ajax em modo síncrono, chamando
jQuery.ajaxSetup({async:false});
E depois realize suas chamadas Ajax utilizando jQuery.get( ... );
Então liga-o uma vez mais.
jQuery.ajaxSetup({async:true});
Acho que funciona como sugerido por @Adam, mas pode ser útil para alguém que quer reconfigurar sua jQuery.get()
ou jQuery.post()
para a mais elaborada jQuery.ajax()
sintaxe.
Excelente solução! Eu notei quando tentei implementá-la que se eu devolvesse um valor na cláusula de sucesso, ele voltava como indefinido. Eu tive que armazená-lo em uma variável e retornar essa variável. Este é o método que eu inventei:
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;
}