Esta respuesta utiliza promises
, una característica de JavaScript del ECMAScript 6
estándar. Si su plataforma de destino no es compatible promises
, complétela con PromiseJs .
Las promesas son una forma nueva (y mucho mejor) de manejar operaciones asincrónicas en 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
});
}
Esto puede parecer una sobrecarga significativa para este ejemplo simple, pero para un código más complejo es mucho mejor que usar devoluciones de llamada. Puede encadenar fácilmente múltiples llamadas asincrónicas utilizando múltiples then
declaraciones:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
También puede ajustar los aplazamientos de jQuery fácilmente (que se devuelven de las $.ajax
llamadas):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
Como señaló @charlietfl, el jqXHR
objeto devuelto por $.ajax()
implementa la Promise
interfaz. Por lo tanto, no es realmente necesario envolverlo en un Promise
, se puede usar directamente:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
function1
realizando una operación asincrónica?