我有函数,f1,我想在f1完成时发出回调,怎么做?

时间:2010-09-30 16:51:50

标签: javascript jquery

如何创建一个调用另一个函数的函数,当它完成时,触发另一个回调函数?

所以现有的功能是:

function f1(..) {..}

function myCallback() {...}

现在可以让f1开火并完成,那么运行myCallback()?

7 个答案:

答案 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" 

jsFiddle example