7

我有以下函数每 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 函数完成后做一些其他的事情。

4

3 回答 3

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";
});
于 2012-10-15T19:56:04.870 回答
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(); }
})();
于 2012-10-15T20:23:18.000 回答
1

代替

success: do(response)

success: function(response) { do(response); do_this_as_well(); }
于 2012-10-15T19:55:52.463 回答