在 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 实现,同时释放调用堆栈,以便可以执行其他代码。
本例的执行顺序(简化)如下:
sleepingFunc()
放在调用栈上
- 在迭代中:
await
实现 Promise,暂停此调用以释放调用堆栈
- 在调用堆栈上放置新调用
- 最终,Promise 得以实现,结束
await
将挂起的回调返回到调用堆栈
- 重复直到
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();
我正在尝试在 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 实现,同时释放调用堆栈,以便可以执行其他代码。
本例的执行顺序(简化)如下:
sleepingFunc()
放在调用栈上- 在迭代中:
await
实现 Promise,暂停此调用以释放调用堆栈
- 在迭代中:
- 在调用堆栈上放置新调用
- 最终,Promise 得以实现,结束
await
将挂起的回调返回到调用堆栈 - 重复直到
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();