在ajax成功或失败之前调用函数

时间:2014-11-14 00:19:50

标签: javascript jquery ajax

我使用$ .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()。任何建议,请。

4 个答案:

答案 0 :(得分:2)

AJAX支持beforeSend

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

我误解了你的问题。我觉得你需要.always()

答案 1 :(得分:2)

我认为您正在寻找具有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()
});

答案 2 :(得分:0)

$ .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"

答案 3 :(得分:0)

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

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