Функция .always не ожидает завершения других AJAX-запросов, потому что она вызывается сразу после того, как самый внешний запрос получает ответ. Тот факт, что запросы вложены, означает, что последующие AJAX-запросы будут вызываться после того, как будут разрешены другие, но если вы хотите сделать что-то только тогда, когда и после того, как все они будут разрешены, Promises потребуется.
Я изменил ваш код, чтобы показать один из способов достижения вашей цели с помощью Promises и функции async / await.
function firstAJAX() {
return new Promise((resolve, reject) => {
$.ajax({ //Outermost AJAX
type:"GET",
url:"/qrcode/login/",
data:{
"cellphone": 111111111111,
"password": "pwd"
}
})
.done(function(responsedata) {
// var parsedJson = $.parseJSON(responsedata);
var parsedJson = {};
parsedJson.result = 1;
if(parsedJson.result==1){
resolve(responsedata);
}
else{
alert(parsedJson.title+"\n"+parsedJson.description);
}
})
.fail(function(xhr, status, errorThrown) {
console.log(status);
});
});
}
function secondAJAX(data) {
return new Promise((resolve, reject) => {
$.ajax({
type:"GET",
url:"/qrcode/entry/",
data:{
"token": "token",
"parking_lot_id": 11,
"in_or_out": 22
}
})
.done(function(responsedata) {
// var parsedJson = $.parseJSON(responsedata);
var parsedJson = {};
parsedJson.result = 1;
if(parsedJson.result==1){
resolve(responsedata);
}
else{
alert(parsedJson.title+"\n"+parsedJson.description);
}
})
.fail(function(xhr, status, errorThrown) {
console.log(status);
});
});
}
function thirdAJAX(data) {
return new Promise((resolve, reject) => {
$.ajax({
type:"GET",
url:"/qrcode/zero/",
data:{
"booking_id": 222,
"token":"token"
}
})
.done(function(responsedata) { //Innermost done
// var parsedJson = $.parseJSON(responsedata);
var parsedJson = {};
parsedJson.result = 1;
if(parsedJson.result==1){
alert("進場成功! 請使用易停網APP繳費與出場.");
// window.location.href = "/download";
resolve(responsedata);
}
else{
alert(parsedJson.title+"\n"+parsedJson.description);
}
})
.fail(function(xhr, status, errorThrown) {
console.log(status);
});
});
}
async function loginAndEnter() {
const first = await firstAJAX();
const second = await secondAJAX(first);
const third = await thirdAJAX(second);
$("#login-and-enter-btn").prop('disabled', false);
$("#login-and-enter-btn").text('登入和升起柵欄進場');
}
Таким образом, все работает так, что функция loginAndEnter будет ожидать разрешения firstAJAX, secondAJAX и thirdAJAX. Все эти функции возвращают Promises, которые разрешаются, когда GET-запрос успешно получает ответ. secondAJAX и thirdAJAX принимают один параметр, который является ответом, передаваемым асинхронно (благодаря 'await') из функции, вызываемой перед ним.
Я изменил многие значения для своих собственных целей тестирования, поэтому, пожалуйста, измените их на свои, прежде чем испытывать их.