回调在所有函数的末尾包含在一个函数中
Callback at the end of all the functions contained in one function
我发现自己在一个回调问题上卡住了好几天,我找不到任何方便的解决方案。问题在这里:
我有一些像这样的jQuery
$(document).ready(function(){
masterFunction_A();
masterFunction_B();
});
function masterFunction_A() {
littleFunction_1();
littleFunction_2();
littleFunction_3();
littleFunction_4();
// etc...
}
function masterFunction_B() {
// do stuff
}
我想开始执行masterFunction_B()时,所有的littleFunctions()完成。当我尝试将masterFunction_B()设置为masterFunction_A()的回调时,似乎它是在masterFunction_A()启动所有littleFunctions()时启动的,但不是当littleFunctions()结束时…
I tried to:
- 设置一个计时器,并在计时器结束时启动masterFunction_B(),但是…这不是正确的方式
- 设置回调在所有的littleFunctions和计数器计数,直到正确的回调量被调用,但我认为有一个更好的和更干净的方式来得到我想要的。
你能帮忙吗?
非常感谢!
—EDIT—
这是masterFunction_A()的内容,实际上称为loadContents():
function loadContents () {
$.getJSON('data/data.json', function(data) {
for (var i = 0 ; i < data.length ; i++) {
$(".projects_ordered_list").append("<!-- PROJECT " + i + " -->");
$(".projects_ordered_list").append("<li id='projects_ordered_list_item_" + i + "'></li>");
}
for (var i = 0 ; i < data.length ; i++) {
$("#projects_ordered_list_item_" + i).load('projects.html', function() {
var this_html_id = $(this).attr("id");
var this_id = this_html_id.substr(this_html_id.length - 1);
this__display_id = this_id;
this__display_id++;
$(this).find(".project_id").css("background", data[this_id].color);
$(this).find(".project_id_title").html(this__display_id + ".");
$(this).find(".project_name").html(data[this_id].name.en);
$(this).find(".project_date").html(" — " + data[this_id].date.en);
for (var j = 0 ; j < data[this_id].imgs.length ; j++) {
$(this).find(".bxslider").append("<li><img src='" + data[this_id].imgs[j] + "'></li>");
}
});
}
});
}
使用jQuery ajax函数内置的jQuery延迟,您可以使其像这样工作。
首先,让每个littleFunction_x()
代码看起来像这样:
function littleFunction_1() {
var d = $.getJSON(...)
// other code
return d;
}
然后,你可以这样做:
$(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;
}
在仔细考虑之后,我认为你也可以做一个稍微干净一点的版本,像这样:
$(document).ready(function(){
masterFunction_A().done(masterFunction_B);
});
function masterFunction_A() {
return $.when(littleFunction_1(),
littleFunction_2(),
littleFunction_3(),
littleFunction_4()
);
}
看看jQuery的Deferred特性。我想这正是你所需要的。
首先,为每个littleFunction: 创建一个Deferreddfd1 = $.Deferred();
dfd2 = $.Deferred();
dfd3 = $.Deferred();
dfd4 = $.Deferred();
在每个littleFunction中,解析最后的Deferred:
function littleFunction1() {
...
dfd1.resolve();
}
...
当所有deferred被解析后,开始执行master_Function_B:
$.when(dfd1, dfd2, dfd3, dfd4).then(masterFunction_B);
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 我可以在json对象中添加一个函数吗
- Javascript使函数一个接一个地执行
- 是JavaScript中的函数一个对象
- 两个几乎相等的jQuery函数;一个适用于IE,一个不适用于IE
- 两个Javascript函数一个window.onload=Custom.init;和一个window.onload=f
- 使javascript加载函数一个接一个地执行
- 如何通过两个嵌套的匿名函数(一个带有超时的事件处理程序)传递变量
- 为什么我不能让两个jQuery函数一个在另一个里面呢?
- 给函数一个变量名,而不是它的值
- 如何使用嵌入函数(一个滚动页由Pete - peachananr)
- 是否有可能给JavaScript函数一个类型/类?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- 两个不同的ajax函数一个接一个调用返回相同的值
- jQuery第一次更改函数一个工作
- 给这个函数一个id
- 如何给回调函数一个值一个变量在特定时刻
- 使用回调使两个函数一个接一个地运行
- 两个函数(一个用php)是否可以用“;onclick”;
- 两个几乎相同的函数.一个函数用Queue进行排队.Jquery效果在queued函数上不起作用.为什么