在 javascript 循环中添加超时/睡眠功能

Add Timeout / Sleep function inside javascript loop

我正在尝试在 js 文件中添加睡眠/延迟功能,这个:

var webTest = function()
{

let regex = /^https?:\/\//;
let url = $('#list_urls').val().split('\n');
var xmlhttp = [], i;
var myObj2 = [], i;
 for(let i = 0; i < url.length; i++)
    {
    (function(i) {
    xmlhttp[i] = new XMLHttpRequest();
    url[i] = url[i].replace(regex, '');
    xmlhttp[i].open("GET", "https://website.com/API?key=<MY_API_KEY>&url="+url[i], false);
    xmlhttp[i].onreadystatechange = function() {
      if (xmlhttp[i].readyState === 4 && xmlhttp[i].status === 200) {
        myObj2 = JSON.parse(xmlhttp[i].responseText);
        document.getElementById("demo"+i).innerHTML = myObj2.results[1].categories;
      }
    };
xmlhttp[i].send();
})(i);
console.log(`The Server2: `+ myObj2);
 }
}

我希望此脚本暂停 10 秒,然后再次执行工作,然后再次暂停 10 秒,并这样做直到文本长度大于循环中的 i!如果我 运行 单次,我的代码有效,但如果我 运行 在循环中,它不起作用,因为 网站 中有速率限制]api 所以这就是我尝试添加睡眠功能的原因。

所以我尝试了 await sleep(); 方法,也尝试了 setTimeout 方法,但它没有按预期工作sort 它对我的代码根本不起作用!

等待睡眠();只是根本不起作用并显示类似的消息 未捕获的语法错误:await 仅在异步函数和异步生成器中有效webTestfile.js:27

此运行代码段每1秒运行一个任务,直到满足条件,然后清除计时器。

const work = (i)=>{
 console.log('doing work here ', i);
}

let counter = 0
const timer = setInterval(()=>{
  if (timer && ++counter >= 10) {
   clearInterval(timer)
  }
  work(counter);
}, 1000)

你可以make use of ES6's async/await-feature

要使用 await,它需要在 function/expression 主体中声明 async

基本上,这将使您的函数成为异步函数,并等待 Promise 完成。我们使用 setTimeout().
在设定的延迟后实现该 Promise 注意“在设定的延迟之后”并不意味着“正好在之后”,它基本上意味着“在之后尽可能早”。

通过这样做,异步函数等待 promise 实现,同时释放调用堆栈,以便可以执行其他代码。

本例的执行顺序(简化)如下:

  1. sleepingFunc() 放在调用栈上
    • 在迭代中:await 实现 Promise,暂停此调用以释放调用堆栈
  2. 在调用堆栈上放置新调用
  3. 最终,Promise 得以实现,结束 await 将挂起的回调返回到调用堆栈
  4. 重复直到 sleepingFunc() 完成

正如您在第 3 步中看到的,如果其他调用占用的时间超过延迟时间,则挂起的调用将不得不等待额外的时间。

function sleep(ms) {
  return new Promise(resolveFunc => setTimeout(resolveFunc, ms));
}

async function sleepingFunc() {
  for (let i = 0; i < 5; ++i) {
    console.log(i + " - from sleep");
    await sleep(1000);
  }
}

function synchronousFunc() {
  for (let i = 0; i < 5; ++i) {
    console.log(i + " - from sync");
  }
}

sleepingFunc();
synchronousFunc();