2017-07-27 77 views
1

我想將回調函數或函數鏈接到另一個函數。javascript將回調函數綁定到任何函數

有一個類似的問題(沒有任何有效的答案):jQuery , bind a callback to any function

但是,對我來說我不希望僅限於jQuery的境界。 我在尋找更廣泛的答案,我想知道是否有可能與香草JavaScript或庫以外的jQuery。

例子:

// a function which I don't want or I can't edit it's body 
var thirdPartyObject = { 
    doSomething: function(args) { 
     // a lot of code 
     console.log('doing stuff: ' + args); 
    } 
}; 

// my function 
var easyCallback = function() { 
    // processing stuff 
    console.log('doing more stuff'); 
} 

// the bind 
magicLibrary.bind(thirdPartyObject.doSomething, easyCallback); 

// run 
thirdPartyObject.doSomething(1); 
thirdPartyObject.doSomething(10); 

當我運行這個 「碼」,下面的輸出代表我在尋找的行爲:

doing stuff: 1 
doing more stuff 
doing stuff: 10 
doing more stuff 

這可能嗎?


編輯:在bind是一個概念性的名詞,也許你覺得這像一個chaintrigger甚至另一個術語。

但是導入是第二個函數或回調,在我的例子中是easyCallback()必須以某種方式連接到第一個doSomething()

而且每次調用或執行doSomething()我都希望easyCallback()在第一次完成後也能執行。

但沒有「包裹」他們周圍或不重寫第一個。

+0

只要定義調用一個,然後其他'VAR callsBoth =()函數的函數{myEasyCallback(thirdParty.something ()); });' –

+0

這是不綁定或鏈,即封裝函數,但我感謝您的建議。 –

回答

5

你將不得不包裹doSomething功能另一個函數內部,就像這樣:

// a function which I don't want or I can't edit it's body 
var thirdPartyObject = { 
    doSomething: function(args) { 
     // a lot of code 
     console.log('doing stuff: ' + args); 
    } 
}; 

// my function 
var easyCallback = function() { 
    // processing stuff 
    console.log('doing more stuff'); 
} 

// the bind 
// magicLibrary.bind(thirdPartyObject.doSomething, easyCallback); 
const doSomething = thirdPartyObject.doSomething.bind(thirdPartyObject); 
thirdPartyObject.doSomething = function(args) { 
    doSomething(args); 
    easyCallback(args); 
}; 

// run 
thirdPartyObject.doSomething(1); 
thirdPartyObject.doSomething(10); 
+0

@Jasmshid Asadzadeh謝謝你的回答。 Altought適用於這個通用示例,但並不完全如我所描繪。因爲這個函數將原始版本的函數綁定到對象'thirdPartyObject',然後在一個新的引用上創建一個「快照」,並最終重寫函數包裝的'doSomething'函數。 –

+1

@PauloOliveira請描述你想要的東西,正好 –

+0

@Jasmshid Asadzadeh我的道歉,我編輯帖子,我試圖解釋我可以做的最好的,請告訴我,如果仍然缺少信息或者它變得更混亂。 我贊成你正在服用的時間。 :) –