如何在函数执行完成后调用函数? - Javascript

时间:2011-10-25 21:22:56

标签: javascript jquery asp.net

我正在使用一个用户控件,该控件具有在执行操作时调用的一组javascript函数。此用户控件在应用程序的许多位置使用。

当其中一个内置JS函数完成执行时,我需要在我的页面上触发自定义JS函数。

当另一个函数完成执行时,我有没有办法附加要触发的函数?我不想更新内置的JS函数来调用这个JS函数。

希望这是有道理的。

4 个答案:

答案 0 :(得分:4)

您可以使用几种设计模式,具体取决于具体代码(您尚未共享)以及您可以和不可以更改的内容:

选项1:为某些现有代码添加回调:

function mainFunction(callbackWhenDone) {
    // do other stuff here
    callbackWhenDone();
}

所以,你可以用:

来调用它
mainFunction(myFunction);

选项2:换行上一个功能:

obj.oldMethod = obj.mainFunction;
obj.mainFunction = function() {
    this.oldMethod.apply(this, arguments);
    // call your stuff here after executing the old method
    myFunction();
}

所以,现在任何时候有人这样做:

obj.mainFunction();

它会调用原始方法,然后调用你的函数。

答案 1 :(得分:2)

你基本上是在尝试做回调。既然你没有提到你正在谈论的函数(如在代码中),最好的办法就是基本上包装函数,-quick和dirty-并使其与回调一起使用。

这样你可以传递Lambda(匿名函数)并在完成后执行你想要的任何东西。

更新以演示如何添加回调:

function my_function($a, $callback) {
   alert($a);
   $callback();
}

my_function('argument', function() { 
  alert('Completed');
});

答案 2 :(得分:2)

最丑陋和最好的解决方案是修补内置功能。假设内置函数被称为“thirdParty”:

// first, store a ref to the original
var copyOfThirdParty = thirdParty;
// then, redefine it
var thirdParty = function() {
    // call the original first (passing any necessary args on through)
    copyOfThirdParty.apply(this, arguments);
    // then do whatever you want when it's done; 
    // custom code goes here
    customFunction();
};

我们基本上创建了内置函数的修改版本,而没有触及原始版本。

答案 3 :(得分:1)

由于Javascript是高度动态的,您可以修改原始函数而无需修改其源代码:

function connect_after(before, after){
    return function(){
        before.apply(this, arguments);
        after();
    };
}

var original_function = function(){ console.log(1); }
original_function = connect_after(original_function, function(){ console.log(2); })