Esta resposta usa promises
, um recurso JavaScript do ECMAScript 6
padrão. Se sua plataforma de destino não suportar promises
, preencha com o PromiseJs .
As promessas são uma maneira nova (e muito melhor) de lidar com operações assíncronas em JavaScript:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable).then(function() {
//this function is executed after function1
function2(someOtherVariable);
});
}
else {
doThis(someVariable);
}
});
function function1(param, callback) {
return new Promise(function (fulfill, reject){
//do stuff
fulfill(result); //if the action succeeded
reject(error); //if the action did not succeed
});
}
Isso pode parecer uma sobrecarga significativa para este exemplo simples, mas para código mais complexo é muito melhor do que usar retornos de chamada. Você pode facilmente encadear várias chamadas assíncronas usando várias then
instruções:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
Você também pode agrupar os adiadores do jQuery facilmente (retornados pelas $.ajax
chamadas):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
Como observou @charlietfl, o jqXHR
objeto retornado por $.ajax()
implementa a Promise
interface. Portanto, não é realmente necessário envolvê-lo em um Promise
, ele pode ser usado diretamente:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
function1
executando uma operação assíncrona?