【问题标题】:Listen for a function to be called JavaScript侦听要调用 JavaScript 的函数
【发布时间】:2012-10-05 20:40:11
【问题描述】:

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

【问题讨论】:

  • 2000 = 2 秒而不是 2 分钟。您在 setInterval 中拥有的是毫秒。这只是一个评论
  • 不要将你的函数命名为dodo 是 Javascript 中的保留字。
  • 顺便说一下,setInterval 的参数需要翻转 - 函数首先出现,然后是毫秒:developer.mozilla.org/en-US/docs/DOM/window.setInterval
  • 谢谢,即时制作了这个例子,那里有很大的错误。
  • 我认为您正在寻找 javascript 中的观察者模式:dustindiaz.com/javascript-observer-class

标签: javascript jquery javascript-events event-handling


【解决方案1】:

首先,您的简化版本不起作用,因为您需要传递 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";
});

【讨论】:

  • 有点尝试使用相同的代码,所以我的问题更多是关于添加“eventListener”
  • @jaxkodex:关于你的编辑,不,你不能直接修改do (至少没有一些hackish .toString()eval技巧)或绑定一些事件到它的调用。但是您可以轻松地将do 包装在另一个执行其他工作的函数中。有几种方法可以解决这个问题。
【解决方案2】:

如果您想保持现有代码不变,可以将 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(); }
})();

【讨论】:

  • 您正在忽略第一个函数,并使用我需要调用的 Action 将相同的旧功能包装在一个新函数中;它会保留来自 ajax 回调的引用吗?
  • 很难说不知道你在做什么,你说你的例子是简化的。但是如果你传递单个响应参数,这个参数会被转发。
  • 我知道它会覆盖它,并且当 ajax 请求成功时,示例(因为它在那里)将调用“do_this”函数。这是有道理的,特别是因为您添加了原因。我做对了吗?
【解决方案3】:

替换

success: do(response)

success: function(response) { do(response); do_this_as_well(); }

【讨论】:

  • 那么,有没有办法给已经内置的函数添加监听器?
  • 我明白了。我想您可以将 do() 包装在另一个函数中,它可以像侦听器一样工作,但是 JavaScript 本身并不能提供您想要的。
  • 我想解决方案是从 ajax 请求修改成功回调。有什么方法可以在运行时执行此操作(我无法更改代码)-顺便感谢您的回答。
  • 查看我在运行时替换 do() 的其他答案。
猜你喜欢
  • 2013-05-18
  • 1970-01-01
  • 2016-04-05
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多