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

How to loop API calls for hierarchy until a condtion is true?

我正在尝试找出使 API 调用循环直到满足条件(或者如果有更好的解决方案。)的“最佳”方法。

API 将为我提供有关一家公司的 ultimateBeneficialOwners 的数据。 一个公司可以有多个所有者,类型可以是:corp 或 person。

我的目标是为每个找到的所有者收集所有信息,直到找到 type:person 的所有者。然后我知道我找到了最高级别的所有者。

假设我请求公司 A 的所有所有者。

const requestResult = await lookupOwners(cinForCompanyA);

公司 A 归公司 B 所有,因此响应如下所示:

{
 owners: [
  {
   title: 'Company B',
   type: 'corp',
   cin: 1234,
  }
 ]
}

我存储了该数据,现在我想为 CompanyB 请求数据

const requestResult = await lookupOwners(1234);

并继续此过程,直到响应对象具有 type: 'person'。 所以假设查找公司 B returns john 和 Anna 作为所有者:

{
 owners: [
  {
   name: 'john',
   type: 'person',
  },
  {
   name: 'anna',
   type: 'person'
 ]
}

所以总结一下:如果所有者是 type: corp,我想为每个公司提出一个新的 api 请求,直到响应包含一个准确的人。那么我们就完成了!

我正在寻找一种无论初始公司拥有 10 级所有者还是 0 级所有者都有效的方法。

什么是好的方法?

希望这有意义吗?

问候 卡斯帕

使用先进先出 (FIFO) 队列和 while 循环。一旦找到 while type: 'person' 的所有者,就立即跳出 while 循环。使用数组并使用 .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);
    }
  }
}

你的可能性很复杂,因为任何一家公司都可以有多个所有者......而且你不能保证你可以拥有人员和公司所有者的组合......以下应该 return 各级所有人的数组

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

我想我会尝试通过递归来解决这个问题,只需将每个返回的 cin 放回函数中,直到它找到一个人。您还可以添加检查,具体取决于每个公司是否终止于一个人,或者是否在某个时候您得到空值或您有什么,取决于您查询的 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);