私のSocket.IOイベントと他のアプリケーションとの間にミドルウェアレイヤーを構築しています。私はこれを実行して、将来Socket.IOを他のものに交換することができます。`.bind()`で呼び出される2つの関数を比較するには?
私はコールバック関数を配列に格納します。特定のイベントが発生すると、配列をループしてコールバック関数を実行します。それは魅力のように機能します。
問題は、その配列からコールバックを削除することにあります。コールバック関数を削除する必要がある場合は、配列をループし、すべての配列項目を調べて、削除するコールバックと等しいかどうかを確認します(===
を使用)。コールバックが配列に格納されている場合、これは正常に動作します。ただし、コールバックが.bind()
と組み合わされて格納されている場合、等しいチェックはfalseを返します。
私は問題を示すために(簡略化した)コードを作成しました:http://codepen.io/petergoes/pen/wWPJdg?editors=0012。
私はSocket.IOコードからインスピレーションを得て、削除方法を書いています:。ただし、同じ問題が発生します。
大きな問題:
(1またはその両方)が.bind()
メソッドで呼び出されたときに、私は2つの機能を比較するにはどうすればよいですか?
この回答が見つかりましたhow do I compare 2 functions in javascriptです。ただし、関数の文字列バージョンを比較すると、少し大ざっぱな感じ
codepen参考のために:
var callbackList = [];
var objA = {
myCallbackFunction: function myCallbackFunction() {
console.log('hello my name is:', this.myName);
}
}
var objB = {
register: function register(callback) {
console.log('register callback');
callbackList.push(callback);
},
remove: function remove(callback) {
console.log('remove callback');
if(callbackList[0] === callback) {
console.log('callback found, splice it');
callbackList.splice(0, 1);
} else {
console.log('callback NOT found!');
}
console.log('callbackList length:', callbackList.length);
}
}
objB.register(objA.myCallbackFunction.bind({myName: 'Peter'}));
objB.remove(objA.myCallbackFunction.bind({myName: 'Peter'}));
console.log('\nreset callbackList\n');
callbackList = [];
objB.register(objA.myCallbackFunction);
objB.remove(objA.myCallbackFunction);
これは 'bind'では(おそらくハックを除いて)動作しません。とにかく関数のIDや関数名に頼るべきではありません。この種のメタプログラミングは、悪いコードにつながります(私の意見では)。 – ftor
@ LUH3417機能IDはどういう意味ですか? –
次の式より 'const f = x => x + 1、g = x => x + 1'とすると、関数オブジェクト' f === g'の同一性を比較して 'false'を返します。したがって、それらは同等ですが、同一ではありません。 – ftor