[英]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.