Поэтому мне нужно два вызова ajax, чтобы получить все данные. Для этого я использую вызов jQuery ajax. Но тогда меня немного смущает порядок выполнения. Вот мой проблемный код:
$.ajax({
type: "GET",
url: "/api/data",
dataType: "json"
}).then(function (data) {
console.info("I am the first")//correct
}).then(function () {
//second ajax
$.ajax({
type: "GET",
url: "/api/lifecyclephase",
dataType: "json"
}).then(function (data) {
console.info("I am the second")//third
})
}).then(function () {
console.info("I am the third")//second
})
На выходе
I am the first
I am the third
I am the second
Не следует ли then подождать, пока второй ajax закончит свою работу, прежде чем продолжить?
Правильный:
$.ajax({
type: "GET",
url: "/api/data",
dataType: "json"
}).then(function (data) {
console.info("I am the first")
}).then(function () {
$.ajax({
type: "GET",
url: "/api/lifecyclephase",
dataType: "json"
}).then(function () {
console.info("I am the second")
}).then(function(){
console.info("I am the third")
})
})



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


«Второй» $.ajax - это инициализирован внутри второго .then, но этот $.ajax не является прикованный ни с чем другим - интерпретатор инициализирует запрос, и все, поэтому, когда достигается конец второго .then, следующий.then (third) выполняется немедленно.
Попробуйте вместо этого return выполнить второе обещание - последующий .then будет ждать разрешения Promise только в том случае, если этот Promise возвращается предыдущим .then:
.then(function (data) {
console.info("I am the first")//correct
})
.then(function () {
//second ajax
return $.ajax({
// ...
В проблемном коде просто отсутствует return.
$.ajax({
type: "GET",
url: "/api/data",
dataType: "json"
}).then(function (data) {
console.info("I am the first");
}).then(function () {
return $.ajax({
^^^^^^
type: "GET",
url: "/api/lifecyclephase",
dataType: "json"
}).then(function (data) {
console.info("I am the second");
});
}).then(function () {
console.info("I am the third");
});
Без return нет ничего, что сообщало бы внешней цепочке обещаний о выходе внутреннего обещания, следовательно, внешняя цепочка не ждет, пока внутреннее обещание установится, прежде чем перейти к третьему этапу.