我正在使用访存来一次检索一棵树。获取所有分支后,如何触发动作?这棵树有多个分支,我事先不知道深度。
伪代码:
until Children is empty fetchChildren()
after all children are retrieved doSomething()
我找到了一些答案,但是它们只处理链式then(),而不是树。
[edit]尽管不是强制性的,但我希望该解决方案可以在IE11中运行。我已经在使用Promise并获取polyfills。
答案 0 :(得分:2)
首先等待获取图层元素,然后递归地处理子元素并等待:
async function fetchChildren(layer) {
await Promise.all(layer.map(fetch));
await Promise.all(layer.map(el => fetchChildren(el.children)));
}
( fetch(el)必须是一个有前途的功能)
答案 1 :(得分:1)
这是使用递归异步函数来完成此操作的一种方法,它在返回诺言之前等待元素的子代的提取完成。
这样,我们可以在完成所有操作后调用doSomething
。
const tree = {
url: 'http://www.json-generator.com/api/json/get/cevhxOsZnS',
children: [{
url: 'http://www.json-generator.com/api/json/get/cguaPsRxAi'
}, {
url: 'http://www.json-generator.com/api/json/get/cguaPsRxAi',
children: [{
url: 'http://www.json-generator.com/api/json/get/cfDZdmxnDm'
}]
}]
};
function doSomething() {
console.log("doing something");
}
async function fetchIt(element) {
if (element.children) {
await Promise.all(element.children.map(fetchIt));
}
return new Promise((resolve) => {
console.log("fetching " + element.url);
fetch(element.url).then(res => {
console.log("done");
resolve();
});
});
}
fetchIt(tree).then(doSomething);