아래의이 기능은 원하는대로 작동하지 않습니다. JS 초보자이기 때문에 이유를 알 수 없습니다.
나는 여부를 확인하기 전에 5 초 기다릴 필요 newState
하다 -1
.
현재는 기다리지 않고 바로 확인합니다.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
답변
제공하는 콜백 함수에 코드를 넣어야합니다 setTimeout
.
function stateChange(newState) {
setTimeout(function () {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}, 5000);
}
다른 코드는 즉시 실행됩니다.
답변
당신은 정말로 이것을해서는 안됩니다. 시간 초과의 올바른 사용은 OP의 문제에 대한 올바른 도구이며 일정 기간 후에 무언가를 실행하려는 다른 경우입니다. 조셉 Silber는 그의 대답에서 그것을 잘 보여주었습니다. 일부 비 생산의 경우에 당신이 경우에는 정말 시간 동안 메인 스레드를 중지하려면,이 그것을 할 것입니다.
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
다음과 같은 형식으로 실행합니다.
console.log('before');
wait(7000); //7 seconds in milliseconds
console.log('after');
장기 실행 차단 작업 (예 : 비싼 DOM 조작) 주위의 비동기 작업 혼합을 시퀀싱하기위한 간단한 테스트 사례를 작성했기 때문에 여기에 도착했습니다. 이것은 시뮬레이션 된 차단 작업입니다. 그것은 그 일에 잘 어울리므로 비슷한 유스 케이스로 여기에 도착하는 다른 사람을 위해 게시했다고 생각했습니다. 그럼에도 불구하고 while 루프에서 Date () 객체를 생성하므로 GC가 충분히 오래 실행되면 GC를 압도 할 수 있습니다. 그러나 강조 할 수는 없습니다. 이것은 테스트에만 적합하며, Joseph Silber의 답변을 참조해야하는 실제 기능을 구축하기위한 것입니다.
답변
다음은 새로운 async / await 구문을 사용하는 솔루션 입니다.
ECMAScript 6에 도입 된 새로운 기능이므로 브라우저 지원 을 확인하십시오 .
유틸리티 기능 :
const delay = ms => new Promise(res => setTimeout(res, ms));
용법:
const yourFunction = async () => {
await delay(5000);
console.log("Waited 5s");
await delay(5000);
console.log("Waited an additional 5s");
};
이 방법의 장점은 코드가 동기 코드처럼 보이고 동작하게한다는 것입니다.
답변
다음과 같은 지연 기능을 사용하십시오.
var delay = ( function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
용법:
delay(function(){
// do stuff
}, 5000 ); // end delay
크레딧 : 사용자가 입력을 멈출 때까지 .keyup () 핸들러를 지연시키는 방법은 무엇입니까?
답변
자바 스크립트에서 5 초 동안 일시 중지하려고해서는 안됩니다. 그런 식으로 작동하지 않습니다. 지금부터 5 초 동안 실행되도록 코드 기능을 예약 할 수 있지만 나중에 실행하려는 코드를 기능에 넣어야하며 해당 기능 이후의 나머지 코드는 즉시 계속 실행됩니다.
예를 들면 다음과 같습니다.
function stateChange(newState) {
setTimeout(function(){
if(newState == -1){alert('VIDEO HAS STOPPED');}
}, 5000);
}
그러나 다음과 같은 코드가 있다면 :
stateChange(-1);
console.log("Hello");
console.log()
문은 즉시 실행됩니다. stateChange()
함수 에서 타임 아웃이 시작될 때까지 기다리지 않습니다 . 미리 정해진 시간 동안 자바 스크립트 실행을 일시 중지 할 수 없습니다.
대신 지연을 실행하려는 모든 코드는 setTimeout()
콜백 함수 내에 있거나 해당 함수에서 호출 되어야합니다 .
루핑하여 “일시 정지”하려고한다면, 자바 스크립트 인터프리터를 일정 기간 동안 “매달려”놓아야합니다. Javascript는 단일 스레드에서만 코드를 실행하기 때문에 루핑 할 때 다른 것을 실행할 수 없습니다 (다른 이벤트 핸들러를 호출 할 수 없음). 따라서 변수를 변경하기 위해 다른 코드를 실행할 수 없으므로 일부 변수가 변경되기를 기다리는 루핑은 작동하지 않습니다.
답변
비동기 기능 을 사용 하는 경우 한 줄로 간단하게 수행 할 수 있습니다.
console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);
주의 대상이 NodeJS 인 경우, (이 미리 정의 된 promisified에서는 setTimeout 함수의)이을 사용하는 것이 더 효율적입니다 :
await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec
답변
이 시도:
//the code will execute in 1 3 5 7 9 seconds later
function exec() {
for(var i=0;i<5;i++) {
setTimeout(function() {
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}