Javascript 循环网络请求,直到结果中的条件匹配

Javascript 循环网络请求,直到结果中的条件匹配,javascript,node.js,Javascript,Node.js,我正在尝试使用GoCardless API来确定客户群中是否存在电子邮件地址。 我试图实现的是提取第一组100个结果,如果检查这些结果中的电子邮件是否与我正在检查的电子邮件匹配。 如果是,则返回true。如果没有,那么它将使用第一组结果中给出的游标再次调用API,并继续调用,直到到达末尾或找到结果为止 一旦找到结果,它将中断循环并返回true。如果它到达结果的末尾,但没有找到匹配项,则返回false 我不能完全理解下面的逻辑,然后我还遇到了在循环中等待的问题 const data = await

我正在尝试使用GoCardless API来确定客户群中是否存在电子邮件地址。 我试图实现的是提取第一组100个结果,如果检查这些结果中的电子邮件是否与我正在检查的电子邮件匹配。 如果是,则返回
true
。如果没有,那么它将使用第一组结果中给出的游标再次调用API,并继续调用,直到到达末尾或找到结果为止

一旦找到结果,它将中断循环并返回true。如果它到达结果的末尾,但没有找到匹配项,则返回false

我不能完全理解下面的逻辑,然后我还遇到了在循环中等待的问题

const data = await client.customers.find({limit: 100});
const customers = data.customers;
let found = customers.some(c => c.email === data.email);

if (found) return true;

let cursor = data.meta.cursors.end;
let finished = false;

while (cursor || !finished) {
  // eslint-disable-next-line no-await-in-loop
  const data = await client.customers.find({limit: 100, cursor});
  const f = customers.some(c => c.email === data.email);
  if (f) {
    finished = true;
    found = true;
  }
}

return finished && found;

有人能建议我如何修改此项以获得所需的结果吗?

您应该使用
列表而不是
查找
,并在后续调用中使用一次调用返回的游标(之前/之后):

let after;
while(true) {
  let res = client.customers.list({limit: 100, after});
  if(res.resources.length === 0) {
    return false; // No more customers to look through
  }
  if(res.resources.some(c => c.email === theEmailYouAreLookingFor)) {
    return true;
  }
  after = res.cursors.after;
}

他们的库还有一个助手方法,可以为您遍历页面!发件人:

具有
列表
方法的所有资源也将具有附加的
*All
方法。此方法与常规的
list
方法类似,接受相同的参数,但返回异步生成器

在编写本文时,可以找到
customers.all()
的实现

类似的内容可能适用于您的用例:

wait(client.customers.all()的const customer)的
{
如果(customer.email==”hello@example.com") {
log(`Found!${customer.id}`);
打破
}
}

根据GoCardless的文档,
find
用于查找单个客户。您将需要使用
列表
。您将从调用X获得一个游标,然后该游标将在调用X+1中使用。