Javascript 在一个函数中包含的所有函数的末尾进行回调
我发现自己在回拨问题上被困了好几天,找不到任何方便的解决办法。问题是: 我有一些jQuery看起来像这样Javascript 在一个函数中包含的所有函数的末尾进行回调,javascript,jquery,callback,Javascript,Jquery,Callback,我发现自己在回拨问题上被困了好几天,找不到任何方便的解决办法。问题是: 我有一些jQuery看起来像这样 $(document).ready(function(){ masterFunction_A(); masterFunction_B(); }); function masterFunction_A() { littleFunction_1(); littleFunction_2(); littleFunction_3(); littleFu
$(document).ready(function(){
masterFunction_A();
masterFunction_B();
});
function masterFunction_A() {
littleFunction_1();
littleFunction_2();
littleFunction_3();
littleFunction_4();
// etc...
}
function masterFunction_B() {
// do stuff
}
我想在所有littleFunction()完成后开始执行masterFunction_B()。当我尝试将masterFunction_B()设置为masterFunction_a()的回调时,它似乎是在masterFunction_a()启动所有littleFunctions()时启动的,但不是在littleFunctions()结束时启动的
我试图:
- 设置一个计时器,并在该计时器结束时启动masterFunction_B(),但。。。这不是一个正确的方法
- 在所有LittleFunction中设置回调,并设置一个计数计数器,直到调用正确数量的回调,但我认为有一种更好、更干净的方法来获得我想要的
函数loadContents(){
$.getJSON('data/data.json',函数(数据){
对于(变量i=0;i”);
}
});
}
});
}
看看jQuery延迟特性。我想这正是你需要的
首先,为每个littleFunction创建一个延迟函数:
dfd1 = $.Deferred();
dfd2 = $.Deferred();
dfd3 = $.Deferred();
dfd4 = $.Deferred();
在每个littleFunction中,最后解决延迟的问题:
function littleFunction1() {
...
dfd1.resolve();
}
...
解决所有延迟后,开始执行主功能:
$.when(dfd1, dfd2, dfd3, dfd4).then(masterFunction_B);
使用jQueryAJAX函数中内置的jQueryDeferred,您可以使所有这些都像这样工作 首先,使每个
littleFunction_x()
代码如下所示:
function littleFunction_1() {
var d = $.getJSON(...)
// other code
return d;
}
$(document).ready(function(){
masterFunction_A().done(masterFunction_B);
});
function masterFunction_A() {
return $.when(littleFunction_1(),
littleFunction_2(),
littleFunction_3(),
littleFunction_4()
);
}
然后,您可以执行以下操作:
$(document).ready(function(){
$.when(masterFunction_A()).done(masterFunction_B);
});
function masterFunction_A() {
var d = $.Deferred();
$.when(littleFunction_1(),
littleFunction_2(),
littleFunction_3(),
littleFunction_4()
).done(function() {
d.resolve();
});
return d;
}
在仔细考虑之后,我认为您还可以做一个稍微干净的版本,如下所示:
function littleFunction_1() {
var d = $.getJSON(...)
// other code
return d;
}
$(document).ready(function(){
masterFunction_A().done(masterFunction_B);
});
function masterFunction_A() {
return $.when(littleFunction_1(),
littleFunction_2(),
littleFunction_3(),
littleFunction_4()
);
}
您的函数是否是异步的(它们是否执行Ajax)?如果是这样,你需要一个完全不同的策略。如果没有一个是异步的,那么它的工作方式应该很好,因为javascript是单线程的,不会同时运行两个线程。如果
littleFunction\u X()
是异步的,那么您必须使用通知来通知它们何时完成,以便启动masterFunction\u B()
,我们需要了解更多关于它们是什么的信息,以便确切地知道如何向您提供建议。是的,实际上第一个是loadContents(),并调用$.getJSON()。第二个称为setDimensions(),为加载loadContents()的数据设置尺寸和样式。。不好吗d请显示littleFunction_1()
的实际代码。您必须跟踪其中的ajax调用何时完成。如果您从每个littleFunction_X()
返回延迟的ajax,然后在所有这些函数上使用$,那么您可以非常轻松地执行您想要的操作。when()
,但我们需要查看您的ajax代码,以提供具体建议。我用masterFunction_A()的内容编辑了这篇文章,我已经添加了一个答案,它在每个littleFunction\u X()
函数中使用从$.getJSON()
返回的延迟对象,在它们全部完成时获取通知,这样您就可以运行masterFunction\u B()
。在littleFunction\u X
中有ajax调用。他们已经有了自己的延期,不需要创建单独的延期。好的,我现在正在尝试,我会让你知道的。谢谢