我正在使用一組具有執行操作時調用的javascript函數的用戶控件。該用戶控件在應用程序的很多地方都有使用。函數執行完成時如何調用函數? - Javascript
當一個內置的JS函數完成執行時,我需要在我的頁面上觸發一個自定義的JS函數。
當另一個函數完成執行時,有沒有辦法讓我附加一個被觸發的函數?我不想更新內置的JS函數來調用這個頁面的JS函數。
希望這是有道理的。
我正在使用一組具有執行操作時調用的javascript函數的用戶控件。該用戶控件在應用程序的很多地方都有使用。函數執行完成時如何調用函數? - Javascript
當一個內置的JS函數完成執行時,我需要在我的頁面上觸發一個自定義的JS函數。
當另一個函數完成執行時,有沒有辦法讓我附加一個被觸發的函數?我不想更新內置的JS函數來調用這個頁面的JS函數。
希望這是有道理的。
有,你可以使用這個取決於具體的代碼(你沒有共享),什麼一對夫婦設計模式,你可以和不能改變:
選項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();
它會調用原始的方法,然後調用你的函數。
你基本上試圖做回調。既然你沒有提到你正在談論的功能(如代碼中),最好的做法是基本上包裝這個功能, - 快速和骯髒 - 並使它與回調一起工作。
通過這種方式,您可以將它傳遞給Lambda(匿名函數),並在完成後執行任何您想要的操作。
更新,演示如何添加回調:
function my_function($a, $callback) {
alert($a);
$callback();
}
my_function('argument', function() {
alert('Completed');
});
這些函數是普通的JS函數。你碰巧有一個如何在JS/JQuery中實現回調的例子 – Nick
內置函數不接受回調:( – Nick
添加了一個簡單的例子 – MarioRicalde
最醜陋的和最好的解決方案是猴子修補內置功能。假設內置的功能被稱爲「第三方」:
// 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();
};
我們已經基本上建立了內置函數的修改版本無需接觸原始版本。
由於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); })
你所說的「內在」是什麼意思? –
這個內置函數是否有任何異步?如果是這樣,它是否接受回調? – pimvdb
通過內置,我只是表示這個函數是這個用戶控件(ASP.NET)使用的JS文件的一部分 – Nick