我有以下函数,每 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 函数完成后做一些其他事情。
首先,简化版本不起作用,因为您需要传递 do
函数而不是调用它。
function doRequest (){
$.ajax({ url: 'www.google.com.pe', success: _do });
}
但听起来您是在询问每次调用do
时如何运行其他代码。
如果仅在 doRequest()
函数中调用do
,则只需将其他代码添加到在适当时间调用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";
});
保持现有代码不变,你可以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(); }
})();
替换
success: do(response)
跟
success: function(response) { do(response); do_this_as_well(); }