then()链中的Ajax complete()在预期时不会执行

时间:2017-12-21 03:29:33

标签: jquery ajax

我的Ajax complete()链中的.then()代码出现问题 - 它在预期时无法执行。

我的Ajax函数在beforeSend()上显示一个微调器,并将其隐藏在complete()上以显示正在进行的指示器。我认为这些是我可以捕捉的终点,以决定何时展示微调器。

function ajaxGetActivityId() {  

var promise = $.ajax({
    type : "post",
    dataType : "json",
    url : '/myapp/activityId',   
    data : '',
    beforeSend: function(){
        showLoading();
    },
    complete: function(){
        hideLoading();
    }        
});

    return promise; // Return a promise from this function

}

此函数在.then()链中通过外部函数调用如下:

function outer() {

var promise = ajaxGetActivityId() 
            .then(function(data) {
                outerFunction2();
             });

调试器显示

  1. 我首先进入Ajax方法的beforeSend然后显示 Spinner,这是正确的
  2. 然后我前往outerFunction2() 我的Ajax请求已经完成!那时微调器还在 显示,它不应该。我以为我保证不会 到达outerFunction2(),直到Ajax调用完成。
  3. 然后,在某个时刻,我进入了Ajax函数的complete()

1 个答案:

答案 0 :(得分:1)

来自文档......

  

<强>完整
  请求完成时要调用的函数(执行成功和错误回调之后)。

我想这还包括在之后执行 then / done之类的任何其他承诺处理程序。

我会一个接一个地链接承诺决议。例如,删除complete并尝试

function ajaxGetActivityId() {
  return $.ajax({ ... })
    .then(data => {
      hideLoading()
      return data
    })
}

这将保证在任何其他promise解析处理程序执行之前进行hideLoading()调用。