Javascript 嵌套的then()函数甚至在嵌套的then()函数完成之前就返回承诺

Javascript 嵌套的then()函数甚至在嵌套的then()函数完成之前就返回承诺,javascript,jquery,Javascript,Jquery,我有两个函数,它们应该一个接一个地调用,如下所示 MainFunc().then(DrawChart()); MainFunc()函数内部有我在下面提到的嵌套函数 我希望MainFuc()返回promise,或者在createMultiBatchDropdown()完成后调用DrawChart()函数 我查看了一些链接: 但我不想使用任何设置的超时或延迟功能 我对then()和promise()函数的概念不太熟悉。如有任何帮助,将不胜感激 function MainFunc(){ var

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

MainFunc().then(DrawChart());
MainFunc()函数内部有我在下面提到的嵌套函数

我希望MainFuc()返回promise,或者在createMultiBatchDropdown()完成后调用DrawChart()函数

我查看了一些链接: 但我不想使用任何设置的超时或延迟功能

我对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);
}

GetImpactData
返回一个
Promise
,但它没有与外部
xhr
链接,这意味着调用
MainFunc
将导致
Promise
在调用
createMultiBatchDropdown
之前解析。相反,
返回由
createMultiBatchDropdown
创建的
Promise
,以便它与整个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;
})

可能重复的是,在执行GetImpactData()函数时,它不工作,这意味着一旦ajax成功调用DrawChart(),然后调用createMultiBatchDropdown()