如何延迟迭代嵌套对象
How to iterate through nested objects with delay
我无法独自解决这个问题,需要你的帮助。我正在处理phonegap应用程序中的嵌套主干对象,并希望将它们全部保存。保存时,我想显示加载动画。保存完所有内容后,我想继续下一页/步骤。我已经做到了,但动画不起作用,因为我的保存循环阻止了所有UI更新。(我保存到localStorage,而不是通过ajax。)所以我试图通过在保存每个项目之间插入超时来减缓保存速度。现在保存被延迟了,但在所有内容都被真正保存之前,界面会继续到下一页。我的回调设置似乎不正确。
你知道干净嵌套回调的模式吗?
我整理了一把小提琴来说明我的问题。
你能帮我修复它吗,这样它就可以按正确的顺序创建警报:A1, A2, A3, A4, A5, A6, A7, B1, B2, B3, Everything is finished
提前非常感谢。
如果你不想查看小提琴,下面是代码:
var forest = {
"trees": [{
"id": "tree A",
"leaves": [{
"name": "A1"
}, {
"name": "A2"
}, {
"name": "A3"
}, {
"name": "A4"
}, {
"name": "A5"
}, {
"name": "A6"
}, {
"name": "A7"
}]
}, {
"id": "tree B",
"leaves": [{
"name": "B1"
}, {
"name": "B2"
}, {
"name": "B3"
}]
}]
};
var callback = function () {
alert("Everything is finished");
};
var workOnTree = function (tree, callback) {
var leaves = tree.leaves;
var leafCount = 0;
var delayedAlert = function () {
alert(leaves[leafCount].name);
leafCount += 1;
if (leafCount < leaves.length) {
setTimeout(delayedAlert, 1000);
} else {
if (callback !== undefined && typeof callback == 'function') {
callback();
}
}
};
setTimeout(delayedAlert, 1000);
};
var workOnForest = function (forest, callback) {
var trees = forest.trees;
var treeCount = 0;
var delayedExecution = function () {
if (treeCount == (trees.length - 1)) {
// for last tree pass callback
workOnTree(trees[treeCount], callback);
} else {
workOnTree(trees[treeCount]);
}
treeCount += 1;
if (treeCount < trees.length) {
// this gives a delay between the trees
setTimeout(delayedExecution, 1000);
}
};
setTimeout(delayedExecution, 1000);
};
workOnForest(forest, callback);
如果我理解你想要实现的目标,并且我认为我理解(但我可能错了),那么使用Queue模型不是更好吗?
您需要setTimout()来运行UI事件,以便获得更新。这不需要很长时间,0ms或1ms(只是为了进行优化)就可以了。
我想做的是有一个回调函数,它从你的一个列表中提取一个叶项,处理它,然后如果还有更多的工作要做,每次都用setTimeout()重新安排更多的工作。
这样,您的操作将被串行处理。我不认为你希望它们并行运行,尽管看起来这就是正在发生的事情。所以你的回电也会被连载。
我知道你已经建立了一个人为的例子,专门用来尽可能简单地演示这个问题,但这让你很难理解你想做什么,但我对此有把握吗?
我认为应该使用.sort()方法,并且应该在该方法中添加自己的参数。这些会给你一个想法:如何使用jQuery按字母顺序对列表进行排序?http://james.padolsey.com/javascript/sorting-elements-with-jquery/
我想到了将回调添加到最长的集合中。通过这种方式,回调发生在处理完所有内容之后。
在延迟执行功能中,我这样做:
if (treeCount == maxLeavesTreeIndex) {
// for last tree pass callback
workOnTree(trees[treeCount], callback);
}
因此,不是最后处理的集合得到回调,而是最大的集合。
请参见此处。
你觉得这个解决方案怎么样?
如果你有更好的想法,请提交答案。
- 正在迭代嵌套关联数组
- 使用 JS 迭代嵌套的 JSON 对象
- 对迭代嵌套对象感到困惑
- 如何延迟迭代嵌套对象
- Javascript-迭代嵌套对象,获取值和链式键
- 如何使用Handlebars迭代嵌套对象
- 迭代嵌套JSON到对象数组(JavaScript)
- 通过javascript/lodash迭代嵌套对象数组
- 迭代嵌套的JSON数组并更改属性的值
- 编写一个递归函数,迭代嵌套循环的深度未知
- 在Jquery asp.net中迭代嵌套循环
- 在JSON中获取子元素/使用jQuery/JS迭代嵌套JSON
- 在React中使用map()来迭代嵌套的Prop
- 用angularjs递归迭代嵌套对象
- 迭代嵌套json对象数组
- 使用Jquery迭代嵌套的JSON并返回匹配的索引
- Nodejs -迭代嵌套JSON数组的正确方法
- 如何迭代嵌套对象并在jsx中呈现
- 如何使用asnyc.js迭代嵌套的JSON值
- 使用oud jQuery在JavaScript中迭代嵌套对象