2011-10-25 115 views
1

我正在使用一組具有執行操作時調用的javascript函數的用戶控件。該用戶控件在應用程序的很多地方都有使用。函數執行完成時如何調用函數? - Javascript

當一個內置的JS函數完成執行時,我需要在我的頁面上觸發一個自定義的JS函數。

當另一個函數完成執行時,有沒有辦法讓我附加一個被觸發的函數?我不想更新內置的JS函數來調用這個頁面的JS函數。

希望這是有道理的。

+0

你所說的「內在」是什麼意思? –

+0

這個內置函數是否有任何異步?如果是這樣,它是否接受回調? – pimvdb

+0

通過內置,我只是表示這個函數是這個用戶控件(ASP.NET)使用的JS文件的一部分 – Nick

回答

4

有,你可以使用這個取決於具體的代碼(你沒有共享),什麼一對夫婦設計模式,你可以和不能改變:

選項1:回調加入一些現有的代碼:

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

所以,你可以調用此方法:

mainFunction(myFunction); 

的Opti 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(); 

它會調用原始的方法,然後調用你的函數。

2

你基本上試圖做回調。既然你沒有提到你正在談論的功能(如代碼中),最好的做法是基本上包裝這個功能, - 快速和骯髒 - 並使它與回調一起工作。

通過這種方式,您可以將它傳遞給Lambda(匿名函數),並在完成後執行任何您想要的操作。

更新,演示如何添加回調:

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

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

這些函數是普通的JS函數。你碰巧有一個如何在JS/JQuery中實現回調的例子 – Nick

+0

內置函數不接受回調:( – Nick

+0

添加了一個簡單的例子 – MarioRicalde

2

最醜陋的和最好的解決方案是猴子修補內置功能。假設內置的功能被稱爲「第三方」:

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

我們已經基本上建立了內置函數的修改版本無需接觸原始版本。

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); }) 
相關問題