繁体   English   中英

如何循环 API 调用层次结构,直到条件为真?

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

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