2017-07-27 17 views
1

コールバック/関数を別の関数にバインドまたはチェーンしたいと思います。javascript bind任意の関数へのコールバック

同様の質問は(任意の有効な回答なし)がありますが: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 

それは可能ですか?


EDITbindは概念的な用語ですが、多分あなたはchaintriggerあるいは別の用語のように、これを考えます。

しかし、インポートは、私の例ではeasyCallback()が何らかの形で最初の1つのdoSomething()に接続する必要がある2番目の関数またはコールバックです。

そして、doSomething()が呼び出されるか、実行されるたびに、最初に終了した後にeasyCallback()が実行されるようにします。

しかし、最初のものを書き換えたり書き換えたりすることなく、それらを「ラップする」ことはありません。

+0

ちょうど1し、他の 'の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

@ジャムシッドあなたの答えにAsadzadehありがとう。アルテックはこの一般的な例では機能しますが、正確に描写されたものではありません。これは、関数の元のバージョンをオブジェクト 'thirdPartyObject'にバインドするので、新しい参照にそのスナップショットを作成し、最終的に関数をラップする' doSomething'関数を書き換えます。 –

+1

@PauloOliveiraあなたが欲しいものを記述してください。正確に –

+0

@Jasmshid Asadzadeh私は謝罪します。私はその投稿を編集します。できるだけ詳しいことを説明しようとしました。 私はあなたが撮影している時間をapppreciate。 :) –