等待过去的功能完成以开始新的功能

时间:2018-12-14 06:27:18

标签: javascript jquery jquery-deferred

我有4个Ajax函数,第一个是独立的, 但是其他三个功能都取决于之前的功能。 真实的例子: 我有国家,省,区,镇和路 可以直接致电国家 而所有其他人必须等到
我确保所有功能都正常运行,并且它们获取数据, “因此,ajax请求没有问题”。 在尝试了这两种方法之后:

0x100e44228

我也尝试过 done 方法:

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

结果是它们两个都获得了省级元素,其余所有元素都不被调用(已解析)。 我已经在控制台上查找了任何错误, 但没什么可显示的。

我为此做了一个示例,但这并不像回调函数那样有效:

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

我已经研究了jquery的解释,但并没有理解。 任何人都可以让我更容易理解它吗。

1 个答案:

答案 0 :(得分:3)

这是您的有效代码。我必须添加sleep来模拟ajax延迟。

您的问题是您没有返回对函数调用的承诺。

Working Fiddle

//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);
}