2017-07-27 70 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我的道歉,我编辑帖子,我试图解释我可以做的最好的,请告诉我,如果仍然缺少信息或者它变得更混乱。 我赞成你正在服用的时间。 :) –