【问题标题】:Call a function before ajax Success or Failure在ajax成功或失败之前调用函数
【发布时间】:2023-03-07 19:57:01
【问题描述】:

我正在使用 $.ajax 发出发布请求。然后,我试图在 ajax 请求成功或失败之前调用一个函数。现在我的方法是如下

var someCallback = function() {
     //do something
};
var Success = false;
$.ajax({
    type: "POST",
    url: "/some/service",
    dataType: "text",
    data: JSON.stringify(someData),
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        someCallBack(); //<--- this is the function
        Success = true;//doesnt goes here
    },
    error: function (textStatus, errorThrown) {
        someCallBack();
        Success = false;//doesnt goes here
    }

});

问题是,我需要在 ajax 请求完成后运行 someCallBack(),无论它是成功还是失败,但在调用成功或错误回调之前。我不想在这种情况下使用 ajaxStart 和 ajaxStop。我查看了“完成”回调,但它仅在错误或成功后调用。我不想在两个地方调用 someCallBack() 。任何建议,请。

【问题讨论】:

  • 为什么需要在成功或错误回调之前调用它?有什么功能依赖?
  • 使用promises语法——然后你可以使用.always(),然后是.done().fail()

标签: javascript jquery ajax


【解决方案1】:

我认为您正在寻找ajax' deferred 接口,该接口具有always method。然后你可以链接你的成功/错误处理程序——尽管你不能使用那些进入选项对象的。

$.ajax({
    type: "POST",
    url: "/some/service",
    dataType: "text",
    data: JSON.stringify(someData),
    contentType: "application/json; charset=utf-8"
})
.always(someCallBack)
.done(function (data) {
    var Success = true; // goes here after someCallBack()
})
.fail(function (textStatus, errorThrown) {
    var Success = false; // goes here after someCallBack()
});

【讨论】:

  • 问题是我只想在收到请求的响应后运行 someCallBack。有没有办法做到这一点。
  • 是的,就像一个魅力。我有一些其他问题没有触发 someCallBack..没关系...非常感谢
【解决方案2】:

AJAX 支持beforeSend

$.ajax({
  url: "http://example.com",
  beforeSend: function( xhr ) {
    xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
  }
}).always(function() {
   callback();
});

我误读了你的问题。听起来你需要.always()

【讨论】:

  • 他说“运行 someCallBack() ajax 请求完成
  • beforeSend 是一个预请求回调函数,可用于在发送之前修改 jqXHR(在 jQuery 1.4.x 中为 XMLHTTPRequest)对象。这不符合我的目的。
  • 修改了我的答案。 .always()呢?
【解决方案3】:

$.ajax 返回一个 $.Deferred(更具体地说,是一个 jqXHR),您可以使用它来定义您的回调。在您的情况下,与在 ajax 设置对象中定义回调相比,这样做的优势在于您的回调将按照定义的顺序执行:

$.Deferred() 的行为与您的 $.ajax(settings) 通话一样)

成功:

$.Deferred()
  .always(function() { console.log('always'); })
  .done(function() { console.log('done'); })
  .fail(function() { console.log('fail'); })
  .resolve();
// "always"
// "done"

失败:

$.Deferred()
  .always(function() { console.log('always'); })
  .done(function() { console.log('done'); })
  .fail(function() { console.log('fail'); })
  .reject();
// "always"
// "fail"

同样,如果.always最后定义,它将最后执行:

$.Deferred()
  .done(function() { console.log('done'); })
  .fail(function() { console.log('fail'); })
  .always(function() { console.log('always'); })
  .resolve();
// "done"
// "always"

【讨论】:

    【解决方案4】:

    您只需要绑定 2 个 ajax 事件:ajaxSendajaxComplete。 例如

    $(document).bind("ajaxSend", function(){
        $("#loading").show();
    }).bind("ajaxComplete", function(){
        $("#loading").hide();
    });
    

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2013-01-13
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多