[英]How to loop API calls for hierarchy until a condtion is true?
我试图找出使 API 调用循环的“最佳”方法,直到满足条件(或者如果有更好的解决方案。)
API 将为我提供有关公司最终受益所有者的数据。 一家公司可以有多个所有者,其类型可以是:公司或个人。
我的目标是收集每个找到的所有者的所有信息,直到我找到type:person
的所有者。 然后我知道我找到了最高级别的所有者。
假设我要求 A 公司的所有所有者。
const requestResult = await lookupOwners(cinForCompanyA);
A 公司归 B 公司所有,因此响应如下所示:
{
owners: [
{
title: 'Company B',
type: 'corp',
cin: 1234,
}
]
}
我存储该数据,现在我想为 CompanyB 请求数据
const requestResult = await lookupOwners(1234);
并继续此过程,直到响应 object 具有type: 'person'
。 因此,假设 B 公司的查找返回 john 和 Anna 作为所有者:
{
owners: [
{
name: 'john',
type: 'person',
},
{
name: 'anna',
type: 'person'
]
}
总结一下:如果所有者是type: corp
我想为每个公司提出一个新的 api 请求,直到响应包含一个准确的人。 然后我们就完成了!
我正在寻找一种无论初始公司是否有 10 级所有者或 0 级都可以使用的方法。
什么是好方法?
希望这有意义吗?
关于卡斯珀
我想我会尝试通过递归来解决这个问题,只需将每个返回的 cin 放回 function 直到找到一个人。 您还可以添加检查,具体取决于每个公司是否终止于一个人,或者您是否在某个时候获得 null 值或您有什么值,这取决于您查询的 api 的具体情况。
async function lookup(cin) {
try {
const company = await lookupOwners(cin);
if (company.owners.find((o) => o.type === "person")) {
return company;
} else {
return lookup(company?.owners[0].cin);
}
} catch (e) {
return e;
}
}
lookup(cin);
使用先进先出 (FIFO) 队列和 while 循环。 找到所有者后立即跳出 while 循环 while type: 'person'
。 使用数组并使用.shift()
方法获取行中的第一个元素并使用.append()
将元素添加到行尾,可以轻松实现 FIFO 队列。
这是一些基本代码。
let queue = [companyA];
const foundPerson = false;
const person = null;
while(queue.length > 0 && !foundPerson) {
const company = queue.shift(); // get the first company in line
const owners = await lookupOwners(company);
for(let i = 0; i < owners.length; i++) {
if(owners[i].type === "person") {
foundPerson = true;
person = owners[i];
| }
else {
// if it's not a person, add the company ID to the end of the FIFO queue
queue.append(owners[i].cin);
}
}
}
由于任何一家公司都可以有多个所有者这一事实,您的可能性变得复杂......并且您不能保证您可以拥有人和公司所有者的混合......以下应该完全返回一组所有人的所有者水平
var companyID = 1234;
var peopleOwnerList = [];
var companyOwnerList = [];
companyOwnerList.push(companyID);
do {
const requestResult = await lookupOwners(companyOwnerList[0]);
var ownerList = requestResult.owners;
while(ownerList.length > 0){
if(ownerList[0].type == 'person'){
peopleOwnerList.push(ownerList[0].name);
}
else {
companyOwnerList.push(ownerList[0].cin);
}
ownerList.splice(0,1);
}
companyOwnerList.splice(0,1);
}
while(companyOwnerList.length > 0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.