Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我有一个函数f1,我想在f1完成后发起一个回调,怎么做?_Javascript_Jquery - Fatal编程技术网

Javascript 我有一个函数f1,我想在f1完成后发起一个回调,怎么做?

Javascript 我有一个函数f1,我想在f1完成后发起一个回调,怎么做?,javascript,jquery,Javascript,Jquery,如何创建一个调用另一个函数的函数,并在它完成时调用另一个回调函数 因此,现有的职能是: function f1(..) {..} function myCallback() {...} 现在是否可以让f1启动并完成,然后运行myCallback()?为正在调用的函数提供函数引用作为参数 function f1(fn) { // ... if (typeof fn === 'function') { fn(); } } // can be a defined

如何创建一个调用另一个函数的函数,并在它完成时调用另一个回调函数

因此,现有的职能是:

function f1(..) {..}

function myCallback() {...}

现在是否可以让f1启动并完成,然后运行myCallback()?

为正在调用的函数提供函数引用作为参数

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);
…除非
f1
是异步的,否则在这种情况下,必须编辑
f1
以接受回调并在回调完成时运行它。由于有多种因素可以使函数异步,因此不可能在没有更多细节的情况下给出简单的“…这就是如何”回答

function f1(myCallBack)
{
// f1 activities 


myCallBack();
}
然后调用f1,如:

f1(parameterValue, myCallback);

如果f1只是一个简单的javascript函数,那么它运行synchous,因此您只需在它之后/在f1末尾调用myCallback。如果if做了一些疯狂的ajax事情(在您的例子中是jquery),那么您可以在这些ajax事情上设置回调。

您可以创建一个工具,让您将“onfinish”函数绑定到任何函数:

function bindFollowup(f, followup) {
  return function() {
    f.apply(this, arguments);
    followup && followup();
  };
}
然后您可以定义
f1
,然后写入:

f1 = bindFollowup(f1, myCallback);
。使用阵列可以使其更加灵活:

function f1() {
  var i;
  // ...
  for (i = 0; i < arguments.length; ++i)
  {
      if (typeof arguments[i] === 'function') 
      {
          arguments[i]();
      }      
  }

}
通过上述操作,您可以执行以下操作:

f1("alert me",function() {alert(arguments[0]);});
// Output when the call back is called: 
//    "alert me" 

行前4个空格格式为代码。要对块执行此操作,请选择它并键入
ctr-k
,当然
fn
也可以是匿名函数。=><代码>f1(函数(){…})唯一的问题是,如果你不能修改“f1”,你就有点卡住了。很好,如果htis工作得很好,因为我根本不能修改f1。followup&&followup(),这是做什么的?如果你把它传递给工厂,调用
followup
。@Blankman这只是一个检查,以确保“followup”不为空。它有点蹩脚,你可能想确保它实际上是一个函数(除了不为null或未定义之外)。你是对的,f1是一个ajax调用,所以你必须等待它完成。我没有修改f1的权限。那么你就卡住了。f1是一个黑匣子,它不允许你修改你需要修改的位。看看@pointy的反应,它(还?)不起作用,但让我充满希望@pointy的回应基本上是我上面代码的通用和可重用版本。
function f1() {
  var i;
  // ...
  for (i = 0; i < arguments.length; ++i)
  {
      if (typeof arguments[i] === 'function') 
      {
          arguments[i]();
      }      
  }

}
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"