听一个叫做JavaScript的函数

时间:2012-10-15 19:52:20

标签: javascript jquery javascript-events event-handling

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

3 个答案:

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