嵌套的then()函数甚至在嵌套的then()函数完成之前也会更早地返回promise

时间:2018-08-30 06:42:56

标签: javascript jquery

我有2个函数,它们应该一个接一个地调用,如下所示。

MainFunc().then(DrawChart());

MainFunc()函数内部具有嵌套函数,如下所述。

我希望MainFuc()返回promise或以其他方式在createMultiBatchDropdown()完成后调用DrawChart()函数。

我检查了一些链接:Nesting asynchronous jquery promises 但是我不想使用任何设置的超时或延迟功能。

我对then()和promise()函数的概念是陌生的,将不胜感激。

function MainFunc(){
  var r = $.Deferred();
  var xhr = BatchTypeFilterList(data,id).then(function(res){
     //Logic goes here
     var impactXhr = GetImpactData(id).then(function(result){
         var DropXhr = createMultiBatchDropdown('ImpactBatchSearch',result)
     })
  })
 return r.promise(xhr);
}
function BatchTypeFilterList(){
   var deferred = $.Deferred();
   var xhr = $.ajax({
                  //Ajax Call
              success:function(result){
                   deferred.resolve(result);
                 }
              })
    return deferred.promise(xhr);
}
function GetImpactData(){
   var deferred = $.Deferred();
   var xhr = $.ajax({
                  //Ajax Call
              success:function(result){
                   deferred.resolve(result);
                 }
              })
    return deferred.promise(xhr);
}
function createMultiBatchDropdown(){
  var batchDropDownDeferred = $.Deferred();
  //No ajax call normal jquery logic to form dropdown

  batchDropDownDeferred.resolve(data);
  return batchDropDownDeferred.promise(xhr);
}

1 个答案:

答案 0 :(得分:0)

GetImpactData返回一个Promise,但它没有与外部xhr链接,这意味着调用MainFunc将导致Promise解析< em>之前 createMultiBatchDropdown已被调用。而是return Promise创建的createMultiBatchDropdown,以便它与整个Promise链正确地链接在一起。您还需要返回impactXhr以完成链接。更改为:

var xhr = BatchTypeFilterList(data, id).then(function(res) {
  //Logic goes here
  var impactXhr = GetImpactData(id).then(function(result) {
    return createMultiBatchDropdown('ImpactBatchSearch', result);
  })
  return impactXhr;
})