Javascript 有没有更好的方法覆盖JS ajax回调?

Javascript 有没有更好的方法覆盖JS ajax回调?,javascript,jquery,callback,Javascript,Jquery,Callback,我需要在ajax调用完成时执行不同的操作,具体取决于触发了哪个事件Handler 以下是我的想法: // create object to manipulate later save = { save_to_db: function () { $.ajax({ ...snip... success: function (result) { save.callback(); } })

我需要在ajax调用完成时执行不同的操作,具体取决于触发了哪个事件Handler

以下是我的想法:

  // create object to manipulate later
  save = {
    save_to_db: function () {
      $.ajax({
        ...snip...
        success: function (result) {
          save.callback();
        }
      })
    },
    callback: function () {
      console.log('default callback');
    }
  };

  // normal useage
  $('#b_save').click(function (e) {
    save.save_to_db()
  });

  // one off special useage
  $('#b_add_to_basket').click(function (e) {
    e.preventDefault();
    save.old_callback = save.callback();
    save.callback = function () {
      console.log('overridden call back baby!!')
    }
    save.save_to_db();
    save.callback = save.old_callback();
  });
这个问题:传入回调函数时,可能我缺少如何拥有可以覆盖的默认回调


我的问题是,有没有更好的方法来实现这一点,并且可以对其进行优化?

最好不要在
$.ajax
调用中传递回调-这对于jQuery 1.5是一个很好的用途

更改save_do_db(),使其返回
$.ajax
调用的结果,并删除
成功:
字段:

save_to_db: function () {
  return $.ajax({
    ...snip...
    }
  })
},
callback: ...,
overridden: ...,
然后在调用AJAX调用时注册成功回调:

// normal usage
$('#b_save').click(function (e) {
  save.save_to_db().then(save.callback);
});

// one off special usage
$('#b_add_to_basket').click(function (e) {
    e.preventDefault();
    save.save_to_db().then(save.overridden);
});

请注意,您可能需要做一些额外的工作,以确保
在回调函数中包含一个正常值。

从风格角度来看,您可以使用function maker函数:

function make_saver_function(success_callback){
    return function () {
      return $.ajax({
        ...snip...
        success: sucess_callback
      });
    };
}
这将允许您轻松创建定制的保存功能:

save_to_db = make_saver_function(function(){
    console.log('default callback');
});

one_off_save_to_db = make_saver_function(function () {
      console.log('overridden call back baby!!')
});

其实没什么不同。您的版本仍然需要包装函数来避免重新键入save_to_db。然后在常见情况下(…),我可以接受这个问题的任一答案。谢谢+1对于延迟的对象,我还没有遇到。