# 本文已参与「新人创作礼」活动,一起开启掘金创作之路
今天在做elementui 树组件懒加载时候,如果自己节点过多会一直处于加载状态,查看文档,代码如下:
loadNode(node, resolve) {
if (node.level === 0) {
return resolve([{ name: 'region' }]);
}
if (node.level > 1) return resolve([]);
setTimeout(() => {
const data = [{ name: 'leaf', leaf: true }, { name: 'zone' }];
resolve(data);
}, 500);
}
查看源代码可知,loadNode这个函数是通过promise封装,因此必须用resovle返回,但是我查看自己的代码之后,发现自己已经resolve了数据,如下:
load(tree, treeNode, resolve) {
api.getGroup(this.curTree.id, tree.id).then(res => {
if (res.code == 0 && res.data.list) {
resolve(this.resolveTableData(res.data.list));
} else {
resolve([]);
}
});
},
显然,问题的原因在于resolveTableData这个函数里面,于是我又查看了resovleTableData这个函数,如下:
resolveTableData(arr) {
arr.forEach(async item => {
let appends = '&f_in_device_type=';
this.inspectTypes.forEach(n => {
appends += n + ',';
});
appends = appends.substr(0, appends.length - 1);
let params = {
treeId: '&targetTree=' + this.curTree.id,
groupId: '&targetGroup=' + item.id,
'targetGroupRelation': '&targetGroupRelation=descendantsAndMe&just_count_total=true',
'appends': appends
};
await api.getDevNum(params).then(res => {
item.devNum = res.data.total;
});
item.leaf = !item.leaf;
item.attr.lsxjMaxThread = item.attr.lsxjMaxThread ? item.attr.lsxjMaxThread : 0;
});
return arr;
},
上面用到了两次for循环,第一次是为了得到arr的值,第二次是因为需要for 循环获取参数params,然后将其拼接到下一个函数当中,在上一篇随笔已经讲过为什么会使用async await了,因此现在不做说明
问题的原因就在于我加的async,因为将异步调用置换为同步,但是下面item.leaf = !item.leaf; 这个赋值还是异步的,因此在加载的时候会出现上面同步的两个函数还没有加载成功,子组件的loading便得到了返回值,
load在resolve之后,仍然是 !item.leaf的状态,因此:我将item.leaf = !item.leaf做了同步处理;
setTimeout(() => {
item.leaf = !item.leaf;
}, 100);
这样,loading的问题就没有了