如何在递归获取中使用Promise?

时间:2018-07-13 20:10:16

标签: javascript recursion promise fetch

我正在使用访存来一次检索一棵树。获取所有分支后,如何触发动作?这棵树有多个分支,我事先不知道深度。

伪代码:

until Children is empty fetchChildren()

after all children are retrieved doSomething()

我找到了一些答案,但是它们只处理链式then(),而不是树。

[edit]尽管不是强制性的,但我希望该解决方案可以在IE11中运行。我已经在使用Promise并获取polyfills。

2 个答案:

答案 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);