【问题标题】:How to run function unknown amount of times based on variable?如何根据变量运行功能未知的次数?
【发布时间】:2021-08-08 21:52:53
【问题描述】:

我正在尝试创建一个从端点检索数据的 Javascript API 函数。这里的问题是它返回的最大数量为 1000 条记录,总记录量可达 300.000 条记录。所以我需要循环这个API函数,并在每次运行时不断地将'1000'添加到start变量中。因此,该函数将继续获取记录,直到达到未知的total amount记录。假设这个例子有 300.000。然后它应该循环 300 次。

API 和一切都运行良好。我唯一的问题是我有 start 变量在每次运行后不会给自己添加 1000。它应该将 1000 添加到变量本身,然后再次运行,以检索下 1000 条记录。

这是我的功能:

function loopFunction() {
  function getResponse() {

    if (typeof counter === undefined || counter === null) {
      var start = 0;
    }

    var response = UrlFetchApp.fetch("https://www.apiurl?start=" + start + "&limit=1000&access_token=xxx");

    // Parse data to JSON and get total
    var fact = response.getContentText();
    var data = JSON.parse(fact);

    // Retrieve start number and count
    var start = data.start += 1000;
    var count = data.count;

    var runAgain = count + start;
    var counter = 1;

    return runAgain;

  }
  var runAgain = getResponse();

  console.log(runAgain);

  loopFunction();
}
}

当我运行这个函数时,数据被检索并且循环部分工作。唯一的问题是 console.log(runAgain); 不断返回 1000 而不是 1000、2000、3000、4000、5000 等。有谁知道如何解决这个问题?

【问题讨论】:

  • 你需要在函数外声明和初始化counter。否则每次调用它时它都会重置为1
  • 这听起来不像是从 API 获取数据的最佳方法。
  • counterundefined 时,counter === 'undefined' || counter === null 将不起作用。 undefined'undefined' 根本不是一回事。
  • 这是一个糟糕的设计,你应该看看分页
  • 如果你真的很想这样做,请使用生成器函数。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*

标签: javascript


【解决方案1】:

您需要将函数外部的 start/counter 声明为全局。并在内部使用相同的变量并根据需要更新开始/计数器。还添加一个条件检查 data.count 以退出循环,如果它是最后一个或达到未知数量

var start;
var counter;

function loopFunction() {
  function getResponse() {

    if (counter === 'undefined' || counter === null) {
      start = 0;
    }

    var response = UrlFetchApp.fetch("https://www.apiurl?start=" + start + "&limit=1000&access_token=xxx");

    // Parse data to JSON and get total
    var fact = response.getContentText();
    var data = JSON.parse(fact);

    // Retrieve start number and count
    start += 1000;
    var count = data.count;
    var currentStart = data.start;
    var runAgain = count + currentStart;
    counter = 1;

    return runAgain;

  }
  var runAgain = getResponse();

  console.log(runAgain);

  loopFunction();
}
}

【讨论】:

  • 您需要添加一个条件来检查获得的总数据,以根据您的业务逻辑或 API 响应停止执行周期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多