循环通过 REST API 调用在第一次迭代或最后一次迭代时不正确地中断

Looping through REST API calls improperly breaks at first iteration or last iteration

我正在尝试发送 REST API 调用来检索大量数据。现在,此数据以 JSON 格式返回,并且每次调用 限制为 2000 条记录 。但是,如果有超过 2000 条记录,则有一个名为 nextRecordsUrl 的键,带有 link 到下一个 2000 条记录的端点。

这种模式一直持续到单次调用中的记录少于 2000 条,然后 nextRecordsUrl 未定义。

我有这个循环,本质上是将数据推送到一个数组,然后调用 nextRecordsUrl 键中列出的端点。

    do {
      for (var i in arrLeads.records) {
        let data = arrLeads.records[i];
        let createDate = new GMT(data.CreatedDate, "dd-MM-YYYY");
        let fAssocDate = new GMT(data['First_Campaign_assoc_date__c'],"dd-MM-YYYY");
        let lAssocDate = new GMT(data['Last_Campaign_assoc_date__c'], "dd-MM-YYYY");
        let convDate = new GMT(data.ConvertedDate, "dd-MM-YYYY");
        leads.push([data.FirstName, data.LastName, data.Id, data.Email, data.Title, data['hs_contact_id__c'], createDate, data.Company, data.OwnerId, data.Country, data['Region_by_manager__c'], data.Status, data.Industry, data['Reason_for_Disqualifying_Nurture__c'], data['Reason_for_Disqualifying_Dead__c'], data['Lead_Type__c'], data['First_Campaign_Name__c'], data['First_CampaignType__c'], fAssocDate, data['Last_Campaign_Name__c'], lAssocDate, data['Last_Campaign_Type__c'], convDate, data.ConvertedAccountId, data.ConvertedContactId, data.ConvertedOpportunityId]);
      }

      var arrLeads = getQueryWithFullEndPoint(arrLeads.nextRecordsUrl);
    } while (arrLeads.nextRecordsUrl != null && arrLeads.nextRecordsUrl != undefined);

我曾经使用常规的 while 循环,但它造成了明显的问题,因为如果初始调用有一个空 [,它根本不会 运行 =12=] 字段.

但这也有一个问题。虽然第一次迭代运行良好,但最后一次迭代效果不佳,因为它在循环检查 nextRecordsUrl 字段之前调用下一次迭代。

所以本质上,它会正常循环遍历所有记录。但是当它到达最后一个时,它已经 运行 最后一个端点并且将打破循环,因为现在 'nextRecordsUrl 键是空的。所以最后一次迭代将被忽略。

我想将调用移动到检查之后,就在 do { 之后,但这会导致第一次迭代出现问题。

我也考虑过在 do 之后复制 for 循环,但我更喜欢不涉及复制代码的更简洁的解决方案。

那么我如何以考虑到第一次迭代的方式编写此代码,即使没有第二次迭代和最后一次迭代,它有记录但有一个空 nextRecordsUrl,而没有加倍代码?

我实际上通过对代码进行了一些小的调整来解决了这个问题。

我的问题是我在测试原件之前就拿到了下一批,所以我总是缺 1 批。

解决方案实际上是在每个循环的开始定义一个变量arrLeadsNext = arrLeads.nextRecordsUrl;

并让 while 语句检查这个变量。

所以看起来像这样:

 do {
      var arrLeadsNext = arrLeads.nextRecordsUrl;
      for (var i in arrLeads.records) {
        let data = arrLeads.records[i];
        let createDate = new GMT(data.CreatedDate, "dd-MM-YYYY").process();
        let fAssocDate = new GMT(data['First_Campaign_assoc_date__c'], "dd-MM-YYYY").process();
        let lAssocDate = new GMT(data['Last_Campaign_assoc_date__c'], "dd-MM-YYYY").process();
        let convDate = new GMT(data.ConvertedDate, "dd-MM-YYYY").process();
        leads.push([data.FirstName, data.LastName, data.Id, data.Email, data.Title, data['hs_contact_id__c'], createDate, data.Company, data.OwnerId, data.Country, data['Region_by_manager__c'], data.Status, data.Industry, data['Reason_for_Disqualifying_Nurture__c'], data['Reason_for_Disqualifying_Dead__c'], data['Lead_Type__c'], data['First_Campaign_Name__c'], data['First_CampaignType__c'], fAssocDate, data['Last_Campaign_Name__c'], lAssocDate, data['Last_Campaign_Type__c'], convDate, data.ConvertedAccountId, data.ConvertedContactId, data.ConvertedOpportunityId]);
      }

      var arrLeads = (arrLeadsNext != null) ? getQueryWithFullEndPoint(arrLeadsNext) : '';
    } while (arrLeadsNext != null && arrLeadsNext != undefined);

所以最后的检查没有被下一个 API 调用下一个批次更改,因为它只会在下一次循环迭代开始时更改。