我有以下函数每2秒调用一次以加载一些数据。它注册了函数[do]来做回应的东西。 (示例已简化)。
function doRequest (){
$.ajax({ url: 'www.google.com.pe', success: function (response) {do(response)} });
}
function do (text){
var i = setInterval(doRequest, 2000);
}
我想知道是否有任何方法可以创建一个函数,每次调用[do]函数时调用该函数都需要在do函数内添加对侦听器的调用。提前致谢。如果有更好的方法来使用jquery,就像插件一样,我会很感激帮助。
[编辑]这个想法不是它是否有效。我的问题是关于我是否可以为已经实现的“do”函数添加自定义监听器。像addActionListener(“do”,“after”,doSomeThingElse)之类的东西所以我可以在do函数完成后做其他事情。
答案 0 :(得分:6)
首先,您的简化版本不起作用,因为您需要传递do
函数而不是调用它。
function doRequest (){
$.ajax({ url: 'www.google.com.pe', success: _do });
}
但听起来你每次调用do
时都会询问如何运行其他代码。
如果仅在do
函数内调用doRequest()
,则只需将其他代码添加到在适当时间调用do
的匿名函数。
function doRequest (){
$.ajax({ url: 'www.google.com.pe', success: function(response) {
// Run your other code
// or invoke another function.
_do(response);
} });
}
如果你想要它更通用,你可以创建一个函数装饰器,它返回一个在其他代码之后调用do
的函数。
function doFactory(fn) {
return function() {
fn.apply(this, arguments);
_do.apply(this, arguments);
}
}
然后制作这样的函数:
var doFoo = doFactory(function() {
console.log("foo");
});
如果您的要求更具体地针对response
的预处理,您可以像这样重做:
function doFactory(fn) {
return function(response) {
_do.call(this, fn.call(this, response));
}
}
然后让fn
操纵并返回response
。
var doFoo = doFactory(function(response) {
return response + "foo";
});
答案 1 :(得分:5)
如果您想保留现有代码,可以将do()
包含在另一个函数中,该函数又调用do()
和您的新函数(例如do_this_as_well()
)。
请参阅下面的示例(我将do()
重命名为do_this()
,以避免混淆保留关键字do
)。这是有效的,因为全局函数只不过是带有函数对象的变量。这些变量可以被覆盖,在这种情况下使用调用旧函数的新函数:
function do_this(response) { ... }
(function()
{
var previous=do_this;
do_this=function(response) { previous(response); do_this_as_well(); }
})();
答案 2 :(得分:1)
替换
success: do(response)
与
success: function(response) { do(response); do_this_as_well(); }