Этот ответ использует promisesфункцию ECMAScript 6стандарта JavaScript . Если ваша целевая платформа не поддерживает 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 deferrds (которые возвращаются из $.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выполнение операции асинхронной?