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"