【问题标题】:How to make for loop wait for certain period for every interval till array is completed如何使for循环在每个间隔等待一段时间,直到数组完成
【发布时间】:2022-01-09 00:09:59
【问题描述】:

我正在构建一个像提要一样的小型原型。我有很多项目。对于数组中的每一项,我都需要进行 API 调用并加载结果。

如果我有太多的记录和太多的 APi 调用要进行,这是一个性能问题。

我试图为每 2-3 个 API 调用停止循环 100 毫秒,然后恢复执行直到数组完成。

我做了一个 POC,但效果不佳。您能帮我解决以下代码中的问题吗

// work in progress

var arr = ["val1", "val2", "val3", "val4", "val5", "val6"];

let breakCounter;
async function seriesAPI(arr) {
  breakCounter = 2;
  for (let i = 0; i <= arr.length; i++) {
    if (breakCounter - arr.indexOf(arr[i]) === 0) {
      await interval(arr[i]);

      breakCounter = breakCounter + 2;
    } else {
      makeAPI(arr[i])
      //console.log(arr[i]);
    }
  }
}

function makeAPI(val) {
  console.log(val);
  // fetch(url, {method: 'POST', body: JSON.stringify(arr[i])}).then(res => console.log(res));
}

function interval(arrval) {
  console.log("Buffer time");
  setTimeout(() => {
    makeAPI(arrval)
  }, 1000);
}

seriesAPI(arr);

【问题讨论】:

  • 使用承诺和睡眠
  • @John JavaScript 没有睡眠功能。
  • 您是否希望将所有“许多”并行 API 调用限制为一次仅执行 2-3 个?我建议你考虑throttling
  • @Deykun 制作一个。

标签: javascript


【解决方案1】:

不需要异步

var arr = ["val1", "val2", "val3", "val4", "val5", "val6"];
let cnt = 0;

function makeAPI() {
  if (cnt >= arr.length) return 
  console.log(arr[cnt]);
  // fetch(url, {method: 'POST', body: JSON.stringify(arr[cnt])})
  //  .then(res => setTimeout(makeAPI,cnt%3 === 0 ? 3000: 100));
  cnt++;
  setTimeout(makeAPI,cnt%3 === 0 ? 3000: 100);
}

makeAPI()

【讨论】:

    【解决方案2】:

    我建议您将您的 interval 方法包装为 Promise 并在请求获取之前需要时在循环迭代中调用它。

    var arr = ["val1", "val2", "val3", "val4", "val5", "val6"];
    
    async function seriesAPI(arr) {
      for (let i = 0; i <= arr.length; i++) {
        if (!(i % 3)) { // on each 3rd iteration
          await interval(100); // make 100ms delay
        }
        makeAPI(arr[i])
        // console.log(arr[i]);
      }
    }
    
    function makeAPI(val) {
      console.log(val);
      // fetch(url, {method: 'POST', body: JSON.stringify(arr[i])}).then(res => console.log(res));
    }
    
    function interval(ms) {
      return new Promise(r => setTimeout(r, ms)); 
      // auto-resolve after [ms] milliseconds  
    }
    
    seriesAPI(arr);

    【讨论】:

    • 未定义是怎么回事?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多