gpt4 book ai didi

javascript - 递归地循环遍历树,并在迭代之间设置超时

转载 作者:行者123 更新时间:2023-11-28 00:01:46 25 4
gpt4 key购买 nike

我有一个对象树,其表示如下(简化):

var root = [
{ name: 'child1',
data: 'other_data',
children: [ {
name: 'grand_child1',
data: 'other_data',
children: [...]
}, ... ]
},
{ name: 'child2',
data: 'other_data',
children: [ {
name: 'grand_child2',
data: 'other_data',
children: [...]
}, ... ]
}
]

我需要循环遍历此对象树并根据子级中提供的数据实例化对象,但此过程需要几秒钟,同时会卡住浏览器。

我需要在循环迭代之间设置超时,以便浏览器有机会清除事件队列。

我该如何解决这个问题?

这就是我目前循环遍历它们的方式,没有超时。我目前正在使用相互递归模式。

function performSingleNodeComputation(node) {
performHeavyComputation(node.data)
if(node.children) {
performMultipleNodeComputation(node.children);
}
}

function performMultipleNodeComputation(nodes) {
nodes.forEach(function (node) {
performSingleNodeComputation(node);
});
}

performMultipleNodeComputation(root);

重申一下,我需要在每次调用 performHeavyComputation 之间设置一个超时

最佳答案

2个简单的解决方案

第一种方法:像这样延迟第一级节点计算

var root = [{ 
name: 'child1',
data: 'other_data0',
children: [{
name: 'grand_child1',
data: 'other_data1',
children: null
}]
}, {
name: 'child2',
data: 'other_data2',
children: [{
name: 'grand_child2',
data: 'other_data3',
children: null
}]
}
];


function performHeavyComputation(data){
console.log(data);
}

function performSingleNodeComputation(node) {
performHeavyComputation(node.data);
if (node.children) {
performMultipleNodeComputation(node.children);
}
}

function performMultipleNodeComputation(nodes) {
var i = 0;
function inner() {
performSingleNodeComputation(nodes[i]);
++i;
if (i < nodes.length){
setTimeout(inner, 1000);
}
}
inner();
}

performMultipleNodeComputation(root);

第二种方法:用节点组成数组并延迟执行 1 1 的繁重操作

var root = [{ 
name: 'child1',
data: 'other_data0',
children: [{
name: 'grand_child1',
data: 'other_data1',
children: null
}]
}, {
name: 'child2',
data: 'other_data2',
children: [{
name: 'grand_child2',
data: 'other_data3',
children: null
}]
}
];

function delayedProccessing (root) {

var list = [];

function delayComputation(data) {
list.push(data);
}

function performSingleNodeComputation(node) {
delayComputation(node.data);
if (node.children) {
composeList(node.children);
}
}

function composeList(nodes) {
for (var i = 0; i < nodes.length; ++i){
performSingleNodeComputation(nodes[i]);
}
}

function performHeavyComputation(data){
console.log(data);
}

function proccessList() {
var i = 0;
function inner () {
performHeavyComputation(list[i]);
++i;
if (i <= list.length){
setTimeout(inner, 1000);
}
}
inner();
}

composeList(root);

proccessList();
}

delayedProccessing(root);

关于javascript - 递归地循环遍历树,并在迭代之间设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31731443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com