답변:
제공하는 콜백 함수에 코드를 넣어야합니다 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
자바 스크립트에서 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는 단일 스레드에서만 코드를 실행하기 때문에 루핑 할 때 다른 것을 실행할 수 없습니다 (다른 이벤트 핸들러를 호출 할 수 없음). 따라서 변수를 변경하기 위해 다른 코드를 실행할 수 없으므로 일부 변수가 변경되기를 기다리는 루핑은 작동하지 않습니다.
var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
비동기 기능 을 사용 하는 경우 한 줄로 간단하게 수행 할 수 있습니다.
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
밀리 초 단위로 대기하는 이와 같은 함수를 만드는 가장 좋은 방법은이 함수가 인수에 제공된 밀리 초 동안 대기하는 것입니다.
function waitSeconds(iMilliSeconds) {
var counter= 0
, start = new Date().getTime()
, end = 0;
while (counter < iMilliSeconds) {
end = new Date().getTime();
counter = end - start;
}
}
Joseph Silber의 답변을 바탕으로 , 나는 좀 더 일반적인 방식으로 그렇게 할 것입니다.
당신은 당신의 기능을 가질 것입니다 (질문에 따라 하나를 만들어 봅시다) :
function videoStopped(newState){
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
그리고 당신은 대기 기능을 가질 수 있습니다 :
function wait(milliseconds, foo, arg){
setTimeout(function () {
foo(arg); // will be executed after the specified time
}, milliseconds);
}
결국 당신은 가질 것입니다 :
wait(5000, videoStopped, newState);
그것은 해결책입니다. 대신 대기 함수에 인수를 사용하지 않고 ( foo();
대신 대신 foo(arg);
) 인수를 사용 하지만 그 예입니다.
이 솔루션은 새로 고침 제어에 대한 React Native의 문서 에서 제공됩니다 .
function wait(timeout) {
return new Promise(resolve => {
setTimeout(resolve, timeout);
});
}
이것을 OP의 질문에 적용하기 위해이 기능을 다음과 함께 사용할 수 있습니다 await
.
await wait(5000);
if (newState == -1) {
alert('Done');
}
함수를 약간 변경하여 지연을 추가 할 수 있습니다 (async 및 await).
const add5SecondsDelay = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve('5 seconds');
}, 50000);
});
}
async function asyncFunctionCall() {
console.log("stpe-1");
const result = await add5SecondsDelay ();
console.log("step-2 after 5 seconds delay");
}
asyncFunctionCall();
새로운 JS 기능 생성
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
실행을 늦출 때 함수를 호출하십시오. 지연 값으로 밀리 초를 int 단위로 사용하십시오.
####Some code
sleep(1000);
####Next line
Edge 또는 IE에서 PC 게임을 실행하는 데 사용했습니다. 그리고 7 초 후에 IE Edge를 자동으로 닫습니다.
Firefox와 Chrome은 이런 방식으로 게임을 시작하는 데 사용할 수 없습니다.
<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
var start = new Date().getTime();var end=start;
while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>