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

时间:2011-11-01 12:01:23

标签: javascript jquery callback

我需要在完成ajax调用时执行不同的操作,具体取决于handeler被触发的事件。

以下是我的想法:

  // 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();
  });

这个问题:Javascript callback functions with ajax传递了回调函数,也许我错过了如何使用可以覆盖的默认回调。

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

2 个答案:

答案 0 :(得分:4)

最好不要在$.ajax调用中传递回调 - 这对jQuery 1.5的Deferred objects很有用。

更改您的save_do_db(),以便返回 $.ajax来电的结果,并移除success:字段:

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);
});

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

答案 1 :(得分:4)

从风格角度来看,你可以使用函数制作函数:

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!!')
});