[javascript] 다음 줄을 실행하기 전에 5 초 정도 기다리십시오.

아래의이 기능은 원하는대로 작동하지 않습니다. 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);
    }
}