Esta respuesta utiliza promises, una característica de JavaScript del ECMAScript 6está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 thendeclaraciones:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
También puede ajustar los aplazamientos de jQuery fácilmente (que se devuelven de las $.ajaxllamadas):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
Como señaló @charlietfl, el jqXHRobjeto devuelto por $.ajax()implementa la Promiseinterfaz. 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
});
function1realizando una operación asincrónica?