繁体   English   中英

JS Promise.all 递归

[英]JS Promise.all in recursion

我需要一些关于 JS 承诺的帮助。

服务器上有一个数据:

{ id: 1, name: 'org_1', parent_id: 0 }, { id: 2, name: 'org_2', parent_id: 0 }, { id: 3, name: 'dep_1', parent_id: 1 }, { id : 4, 名称: 'dep_2', parent_id: 1 }, { id: 5, 名称: 'dep_1', parent_id: 2 }...

还有一个简单的代码获取数据:

const fetchData = async (params) => {
  const url = new URL(REMOTE_APP_HOST);
  url.search = new URLSearchParams(params).toString();

  const response = await fetch(url, {
    credentials: "include",
    headers: new Headers({
      Authorization: "Basic " + API_ACCOUNT,
      "Content-Type": "application/json",
    }),
  });
  return await response.json();
};

const findOrgs = async (parent_id) => {
  const params = {
    parent_id: parent_id,
  };

  try {
    return await fetchData(params);
  } catch (err) {
    console.log("findOrgs, fetch error: ", err);
  }
};

const orgsData = async (parent_id) => {
  const data = []
 
  const organizations = await findOrgs(parent_id);

  for (const organization of organizations) {
    const organizationData = {
      name: organization.name,
      type: "organization",
      children: [],
    };

    organizationData.children = await orgsData(
      organization.id
    );

    data.push(organizationData);
  }

  return data
};

const orgsList = async () => {
  return await orgsData(0);
};

如何使用 Promise.all 实现“orgsData”function 的并行版本?

我的努力:

const organizationData = async (organization) => {
  const data = [];

  const orgData = {
    name: organization.name,
    type: "organization",
    children: [],
  };

  const subOrgs = await orgsData_2(organization.id);
  orgData.children = subOrgs.map(organizationData);

  data.push(orgData);

  return data;
}

const orgsData_2 = async (parent_id) => {
  
  const organizations = await findOrganizations(parent_id);

  const promises = organizations.map(organizationData);

  return await Promise.all(promises);
}

但它不工作....

请在orgsData function 中尝试此解决方案。

const organizations = await findOrgs(parent_id);

if (!organizations.map) return; // stop the recursion when no more levels available

const promisesArray = organizations.map(organization => orgsData(organization.id))

const organizationsData = await Promise.all(promisesArray)

const data = organizations.map((organization, index) => {
    return {
        name: organization.name,
        type: "organization",
        children: organizationsData[index],
    }
})

return data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM