我需要在完成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传递了回调函数,也许我错过了如何使用可以覆盖的默认回调。
我的问题是,是否有更好的方法来实现这一点,是否可以进行优化?
答案 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!!')
});