如何创建一个调用另一个函数的函数,当它完成时,触发另一个回调函数?
所以现有的功能是:
function f1(..) {..}
function myCallback() {...}
现在可以让f1开火并完成,那么运行myCallback()?
答案 0 :(得分:15)
提供函数引用作为您正在调用的函数的参数。
function f1(fn) {
// ...
if (typeof fn === 'function') {
fn();
}
}
// can be a defined function name or a variable holding a reference to a function
f1(myCallback);
答案 1 :(得分:1)
f1();
myCallback();
...除非f1
是异步的,否则必须编辑f1
以接受回调并在完成时运行它。由于有许多东西可以使函数异步,因此不可能在没有更多细节的情况下给出简单的“......这就是如何”的答案。
答案 2 :(得分:1)
function f1(param1, callback){
// Do Work
callback();
}
function myCallback(){
// Do Callback Work
}
然后调用f1,如:
f1(parameterValue, myCallback);
答案 3 :(得分:0)
function f1(myCallBack)
{
// f1 activities
myCallBack();
}
答案 4 :(得分:0)
如果f1只是一个简单的javascript函数,它运行同步,所以你只需要在f1结束后调用myCallback。如果有一些疯狂的ajax-stuff(在你的情况下使用jquery),你可以在这些ajax-things上设置一个回调。
答案 5 :(得分:0)
您可以创建一个工具,让您将“onfinish”函数绑定到任何函数:
function bindFollowup(f, followup) {
return function() {
f.apply(this, arguments);
followup && followup();
};
}
然后你可以定义f1
然后写:
f1 = bindFollowup(f1, myCallback);
答案 6 :(得分:0)
<强> lincolnk provided a great answer 即可。使用 arguments
数组可以更加灵活:
function f1() {
var i;
// ...
for (i = 0; i < arguments.length; ++i)
{
if (typeof arguments[i] === 'function')
{
arguments[i]();
}
}
}
像这样,您可以根据需要传入尽可能多的回调函数。它们将按传入的顺序执行。如果参数不是回调,则不会造成任何损害。
最后,您可以使用 apply()
保留f1
的上下文和参数。
在许多情况下,保留上下文绝对有用。我不确定这些论点,但这是一个选择。
function f1() {
var i;
// ...
for (i = 0; i < arguments.length; ++i)
{
if (typeof arguments[i] === 'function')
{
// You can leave off 'arguments', but preserving 'this' will
// often be useful.
arguments[i].apply(this, arguments);
}
}
}
以上允许您执行以下操作:
f1("alert me",function() {alert(arguments[0]);});
// Output when the call back is called:
// "alert me"