执行第三方功能返回功能

时间:2012-09-02 19:43:15

标签: javascript

我需要“检测”某些第三方函数何时返回,然后执行我自己的函数。

示例:我没写的某些功能

function foo(params1){
  console.log(params1);
}

我的职能:

function bar(params2){
  console.log(params2);
}

我需要在调用foo时,它会立即调用bar! 我试过这种方式:

foo = function(params1){
  console.log(params1);
  bar(params2);
}

意思是我“覆盖”foo ..但有时(总是),foo代码太冗长+传递params2(次要)问题。 我尝试了原型的绝望尝试......但后来我想我需要一些支持。

我也试过这个:(但)

var tmp = foo;
foo = function(params1) {
  tmp(params1);
  bar(params2);
}

此处的问题相同,来电者会致电foo(params1),因此酒吧不会“找到”params2


我需要这样做一个像“事件处理程序”的东西 第三方函数进行一些ajax调用,对DOM起作用,我立即采取行动 这样做有一个简洁的方法吗?我希望这很有趣。谢谢。
ps:我虽然关于params2全局,但我仍然需要一个“原创”解决方案:)

关于params2的使用,假设我想为我想要挂钩的每个函数使用不同的参数。

的示例:

var tmp = foo_1;
foo_1 = function(params1) {
  tmp(params1);
  bar(params2);
}

tmp = foo_2;
foo_2 = function(params1) {
  tmp(params1);
  bar(params3);
}
//etc..

3 个答案:

答案 0 :(得分:3)

如果foo是一个全局函数,您可以使用.apply()arguments将其挂钩:

var oldFoo = foo;
foo = function() {
    // call oldFoo with whatever arguments were passed
    var returnVal = oldFoo.apply(this, arguments);

    // do your thing
    bar(params2);

    // if oldFoo had a returned value, return it here
    return(returnVal);
}

您可以在致电原件之前或之后完成工作。 .apply()arguments允许您将原始参数(无论它们是什么)传递到foo,而您甚至不必知道它们是什么。

在你的代码示例中,你没有说params2来自哪里,所以我们很难知道如何将它们注入。你可以从传递给foo的原始参数中提取它们,你可以将它们构建到函数中或从某个对象中检索它们。

您可以选择确定params2应该是什么,并将它们适当地传递给bar()

  1. 从传递给foo的参数中派生出来。要么将相同的参数传递给bar,要么查看传递给foo的参数然后从那些创建bar的参数。
  2. 每次都做同样的事情。你只需将它编码到新功能中。听起来这不是你想要的。
  3. foo被调用之前,将所需的参数放入bar某种全局可达变量中,然后在替换函数中,您可以从全局获取它们
  4. 在调用foo之前,将所需的参数放入bar进行某种关闭,这样您就可以在替换函数中从闭包中获取它们。

答案 1 :(得分:1)

您可以使用function.applyarguments传递给功能

var tmp = foo;
foo = function(params1) {
  tmp.apply(this, arguments);
  bar(params2);
}

答案 2 :(得分:1)

也许您应该使用简单的pubSub系统在foo被调用时收到通知。这会将您bar的呼叫与foo分开。

(function(){
  var footmp = foo;

   foo = function(){
     var result = footmp.apply(this, arguments);
     PubSub.publish('fireBar');
     return result;
  }
})()

PubSub.subscribe( 'fireBar', function(){
 // try to figure out whats params2
 bar(params2)
} );