자바 스크립트 루프 내부에 타임 아웃 / 슬립 기능 추가
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);
}
}
나는 thatn 큰 다시 십초에 대한 일시 정지이 스크립트을 10 초 동안 일시 정지 후 다시 일을하고 싶어이 전까지 텍스트 길이 좋아해요 내가 루프에서! 내 코드는 한 번 실행하면 작동하지만 웹 사이트 에는 API에 속도 제한이 있기 때문에 루프에서 실행하면 작동하지 않으므로 수면 기능을 추가하려고합니다.
그래서 내가 시도한 것은 await sleep (); 메서드와 setTimeout 메서드 도 시도했지만 예상대로 작동하지 않습니다. 내 코드에서 전혀 작동하지 않습니다!
await sleep (); 전혀 작동하지 않고 Uncaught SyntaxError 와 같은 메시지를 표시합니다 . await는 비동기 함수 및 비동기 생성기에서만 유효합니다 .webTestfile.js : 27
답변
ES6의 async/await-기능 을 사용할 수 있습니다 !
를 사용하려면 await
선언 된 함수 / 표현식 본문에 있어야합니다 async
.
기본적으로 이렇게하면 함수가 비 동기화되고 a Promise가 수행 될 때까지 기다립니다 . 를 사용하여 설정된 지연 후에 약속이 이행되도록합니다 setTimeout()
.
참고 "세트 지연 후"않는다는 것을 "가능한 한 빨리 이후로", 그것은 기본적 수단 "정확히 후"하지 의미한다.
이렇게하면 비동기 함수는 약속이 이행 될 때까지 기다립니다. 그 동안 다른 코드가 실행될 수 있도록 호출 스택이 해제됩니다.
이 예제의 실행 순서는 다음과 같이 (단순화 됨) 다음과 같습니다.
sleepingFunc()
콜 스택에 배치- 반복 중 :
await
Promise가 이행되기 위해이 호출을 일시 중단하고 🡒 호출 스택을 해제합니다.
- 반복 중 :
- Callstack에 새로운 전화 걸기
- 결국 약속이 이행되어
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();
이것은 조건이 충족 될 때까지 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)