ajax回调函数javascript中的执行顺序混乱

时间:2019-03-14 11:35:26

标签: javascript jquery ajax asynccallback

在发送(1) show spinner gif请求之前,我打算执行ajax以下ajax操作,在请求完成后,(2) hide gif和3 display适当的警报消息。 最后(4) reload页面。

代码如下:

$.ajax({
   url: rUrl,
   data: {
      id: rID,
      requisitionStatus: rStatus,
      comment: rComment
   },
   type: "POST",
   cache: false,
   beforeSend: function() {
      $("#requisitionStatusDialog").dialog('close');
      $('#ajax_loader_my').show();
   },
   success: function(data, resp) {
      var json = data;
      var obj = JSON && JSON.parse(json) || $.parseJSON(json);
      if (obj.status == "success") {
         alert('Success! ' + obj.message);
         location.reload();
      } else if (obj.status == "error") {
         alert('Error!' + obj.message);
      }
   },
   error: function(data, resp) {
      $("#updateDialog").dialog('close');
      console.log(resp);
   },
   complete: function() {
      $('#ajax_loader_my').hide();
   }
});

但是在这种情况下,alert首先弹出,而spinner gif仍然显示,然后单击reloadsOK

我什至尝试使用hiding回调本身中的success gif,而不是使用complete

success: function(data, resp) {
  var json = data;
  var obj = JSON && JSON.parse(json) || $.parseJSON(json);
  if (obj.status == "success") {
     $('#ajax_loader_my').hide();
     alert('Success! ' + obj.message);
     location.reload();
  } else if (obj.status == "error") {
     alert('Error!' + obj.message);
  }

},

两者给出的结果相同。

4 个答案:

答案 0 :(得分:2)

隐藏微调框之前弹出警报的原因是成功代码在完成之前运行,从而隐藏了微调框。重新加载的原因是,在警报发出后,您发送了location.reload();

检查$('#ajax_loader_my')。hide();实际上隐藏了微调器。 html中包含或包含微调器的元素必须将其id设置为ajax_loader_my。

如果您打开Chrome或Firefox开发工具,则应该能够发送$('#ajax_loader_my')。hide()并查看会发生什么情况。

答案 1 :(得分:1)

以这种方式重写代码,这会将与警报和位置相关的代码放在事件队列中,事件队列将在空闲时运行。

if(obj.status=="success") { 
      $('#ajax_loader_my').hide(); 
      setTimeout(function(){
          alert('Success! '+obj.message);
          location.reload();
      },0);
}

答案 2 :(得分:1)

您好,您应该尝试使用Promise,这里是文档Jquery promises,我是即时制作的,可能会有一些错误,但这只是一个示例:

$( function() {
  function AjaxCall(rID,rStatus,rComment){
    return $.ajax({
      url: 'request.php',
      data: {
        id: rID,
        requisitionStatus: rStatus,
        comment: rComment    
      },
      type: "POST",
      cache: false,
      beforeSend: function() {
        $("#requisitionStatusDialog").dialog('close');
        $('#ajax_loader_my').show();
      }
    })
  }


  $( "#requisitionStatusDialog" ).dialog();

  $("#yourbuttonInputId").on('click',function(event) {
    AjaxCall().done(function(data,response){
      var obj = JSON.parse(data);
      if (obj.status == "success") {
        alert('whe are on done!');
      }
    }).fail(function(data,response){
      $("#updateDialog").dialog(' close');
    }).always(function(data){
      if(confirm('You have finished the request.  Click OK if you wish to continue ,click Cancel to reload the page.'))
      {
        $('#ajax_loader_my').hide();
        $("#requisitionStatusDialog").dialog('open');
      }else{
        location.reload();
      }

    });
  });
} );

编辑:选中此jsfiddle,它将指导您详细说明代码

希望有帮助

答案 3 :(得分:-1)

我宁愿建议使用带有ID的空div或span。 比在该div的html中显示成功。 例如:

$('#ajax_loader_my').hide();    
setTimeout(function () { 
    $('#successDiv').html('Success! ' + obj.message);
    location.reload();
}, 2000);