Вызов jquery ajax внутри функции then

Поэтому мне нужно два вызова 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")
  })
})
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
2 616
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

«Второй» $.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 нет ничего, что сообщало бы внешней цепочке обещаний о выходе внутреннего обещания, следовательно, внешняя цепочка не ждет, пока внутреннее обещание установится, прежде чем перейти к третьему этапу.

Другие вопросы по теме