Ожидание Прошлая функция, чтобы закончить, чтобы начать новую - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть 4 функции Ajax, первая из которых независима, но все остальные три функции зависят от предыдущих.Реальный пример: у меня есть страна, мухафаза, район, город и дорога. Страну можно назвать напрямую, в то время как все остальные должны ждать доЯ позаботился о том, чтобы все функции работали правильно и получали данные, «чтобы не было проблем с запросом ajax».после того, как я попробовал эти два метода:

$.when(GetCountry()).then(function(){
    GetGovernerate();
}).then(function(){
    GetDistrict(GovernerateID);
}).then(GetTown(DistrictID)).then(function(){
    GetRoad(TownID)
});

Я также попробовал метод done :

$.when(GetCountry()).done(function(){
    GetGovernerate();
}).done(function(){
    GetDistrict(GovernerateID);
}).done(GetTown(DistrictID)).done(function(){
    GetRoad(TownID)
});

В результате оба они получили правительствоэлементы и все остальное не называются (разрешены).Я посмотрел на консоль для любой ошибки, но ничего не показать.

Я сделал обходной пример для него, но это не так продуктивно, как функции обратного вызова:

setTimeOut(function(){
    GetGovernerate()
},150,function(){
    setTimeOut(function(){
        GetDistrict();
    },150,function(){
        GetTown();
    });
});

Я изучил объяснение jquery, но не понимаю его.Может ли кто-нибудь, пожалуйста, чтобы мне было легче понять.

1 Ответ

0 голосов
/ 21 декабря 2018

Вот рабочий код для вас.Мне пришлось добавить sleep для имитации задержек ajax.

Ваша проблема в том, что вы не возвращаете обещания вызовов функций.

Рабочая скрипка

//Chain one after another using previous object
$.when(GetCountry()).then(function() {
  return GetGovernerate();
}).then(function() {
  return GetDistrict();
}).then(function() {
  return GetTown();
}).then(function() {
  return GetRoad();
}).done(function() {
  $("body").append("<p>all done</p>");
});

//all needed functions
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function GetCountry() {
  $("body").append("GetCountry<br>");
  return sleep(1000);
}

function GetGovernerate() {
  $("body").append("GetGovernerate<br>");
  return sleep(1000);
}

function GetDistrict() {
  $("body").append("GetDistrict<br>");
  return sleep(1000);
}

function GetTown() {
  $("body").append("GetTown<br>");
  return sleep(1000);
}

function GetRoad() {
  $("body").append("GetRoad<br>");
  return sleep(1000);
}
...