Ця відповідь використовує promisesфункцію JavaScript ECMAScript 6стандарту. Якщо ваша цільова платформа не підтримує promises, заповніть її за допомогою PromiseJs .
Обіцяння - це новий (і набагато кращий) спосіб обробки асинхронних операцій у 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
});
}
Це може здатися суттєвим накладним набором для цього простого прикладу, але для більш складного коду це набагато краще, ніж використання зворотних викликів. Ви можете легко ланцюг кількох асинхронних дзвінків, використовуючи кілька thenоператорів:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
Ви також можете легко обернути відкладені jQuery (які повертаються з $.ajaxдзвінків):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
Як зазначав @charlietfl, jqXHRоб'єкт, що повертається, $.ajax()реалізує Promiseінтерфейс. Тому насправді обгортати його не потрібно Promise, це можна використовувати безпосередньо:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
function1виконання операції асинхронної?