JavaScript를 사용하여 특정 지연 후 스크립트 실행


189

jQuery와 비슷한 JavaScript 메소드가 있습니까 ( delay()또는 wait()특정 시간 동안 스크립트 실행을 지연시키기 위해)?

답변:


189

다음이 있습니다 :

setTimeout(function, milliseconds);

함수가 실행 된 후 전달 될 수있는 함수.

setTimeout()방법을 참조하십시오 .


3
실행되는 표현식이 아니라 함수입니다. @Marius의 대답은 그것을 보여줍니다.
pedrofurla

117
이것은 지연이 아니라 포크입니다. 지연은 동일한 스레드에서 작동해야합니다.
DragonLord

13
이것은 즉시 function_reference를 실행합니다. "비동기 적으로"작동하려면 다음과 같이 지정해야합니다. setTimeout (function () {MethodToCall ();}, 1000);
Bernoulli IT

6
우리가 JavaScript에 대해 이야기하고 있음을 지적하고 싶습니다. "스레드"데리고 또는 그것을 "기적"에 해당 할 수 있습니다 작동합니다 기술적의미 정말이 고려하지만 정말 자바 스크립트의 컨텍스트 내에서 맞지 않는 것은 그 방법 중 하나와 지연을 달성 할 수있는 방법입니다 (당신은 '돈 t 다른 언어에서와 같이 JS에서 "스레드"를 만듭니다. 또한 function_reference포함하지 않으면 즉시 실행 되지 않습니다 (). 즉, function_reference그것은 단지 참조입니다. 전달 function_reference()하면 함수가 즉시 호출됩니다.
Danny Bullis

237

다른 사람들이 말한 것에 덧붙여서 setTimeout: 나중에 매개 변수가있는 함수를 호출하려면 익명의 함수 호출을 설정해야합니다.

나중에 호출하려면 함수를 인수로 전달해야합니다. 사실상 이것은 이름 뒤에 괄호가없는 것을 의미합니다. 다음은 한 번에 경고를 호출하고 'Hello world'를 표시합니다.

var a = "world";
setTimeout(alert("Hello " + a), 2000);

이 문제를 해결하려면 Flubba처럼 함수 이름을 입력하거나 익명 함수를 사용할 수 있습니다. 매개 변수를 전달해야하는 경우 익명 함수를 사용해야합니다.

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";

그러나 해당 코드를 실행하면 2 초 후에 팝업에 'Hello Stack Overflow'가 표시됩니다. 변수 a의 값이 2 초 동안 변경 되었기 때문입니다. 2 초 후에 'Hello world'라고 말하려면 다음 코드 스 니펫을 사용해야합니다.

function callback(a){
    return function(){
        alert("Hello " + a);
    }
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";

2 초간 기다린 후 'Hello world'가 팝업됩니다.


37

조금만 확장하면 ... setTimeout호출 에서 직접 코드를 실행할 수 있지만 @patrick가 말한 것처럼 일반적으로 이와 같은 콜백 함수를 할당합니다. 시간은 밀리 초입니다

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}

27

정말로 (동기화) 블로킹 (동기식) delay기능을 원한다면 다음과 같이하십시오.

<script type="text/javascript">
    function delay(ms) {
        var cur_d = new Date();
        var cur_ticks = cur_d.getTime();
        var ms_passed = 0;
        while(ms_passed < ms) {
            var d = new Date();  // Possible memory leak?
            var ticks = d.getTime();
            ms_passed = ticks - cur_ticks;
            // d = null;  // Prevent memory leak?
        }
    }

    alert("2 sec delay")
    delay(2000);
    alert("done ... 500 ms delay")
    delay(500);
    alert("done");
</script>

2
이 솔루션의 어려움은 프로세서를 적극적으로 사용하기 때문에 전력 사용량이 증가하고 다른 스레드 / 프로세스 (예 : 다른 탭, 기타 프로그램)에 사용할 수있는 리소스가 감소한다는 것입니다. 반대로 절전 모드는 스레드의 시스템 리소스 사용을 일시적으로 중단합니다.
ramcdougal

1
new Date () 대신 Date.now ()를 사용하는 것이 좋으며 메모리 누수에 대해 생각하지 마십시오
WayFarer

1
물론 CPU를 많이 사용하지만 빠르고 더러운 테스트를 위해서는 작동합니다
Maris B.

스레드를 잠그지 않는 버전을 원하므로 delay( 이 질문 에 대답하기 위해) 전에 DOM을 새로 고칠 수 있습니다 . 그렇게 할 방법이 있습니까?
Gui Imamura

3
보다 간단한 루틴 : function delay (ms) {var start_time = Date.now (); while (Date.now ()-start_time <ms); }
Duke

15

setTimeout 을 사용 하고 콜백 함수를 전달해야합니다. 자바 스크립트에서 절전 모드를 사용할 수없는 이유는 전체 페이지가 그 동안 아무것도하지 못하도록 차단했기 때문입니다. 좋은 계획이 아닙니다. Javascript의 이벤트 모델을 사용하고 행복을 유지하십시오. 싸우지 마!


2
여전히 테스트 목적으로 유용합니다. 새로운 HTTP 요청을하기 전에 페이지 변경을 평가하기 위해 몇 초 동안 양식 제출을 지연시키는 것과 같습니다.
rushinge

1
그런 다음 @rushinge는 콜백을 설정하여 양식을 제출하고 기본 양식 제출을 비활성화합니다
Populus

1
링크를 코드로 남겨 두는 것은 좋지 않습니다. 지금은 작동하지 않습니다.
Emmet Arries

1
아니면 그냥 고칠 수도있어
Patrick

14

window.setInterval () 을 사용 하여 일정한 간격으로 일부 코드를 반복적으로 실행할 수도 있습니다 .


2
setInterval () 대신 사용해서는 안됩니다 setTimeout
paul

9
setTimeout()한 번만 setInterval()하고 반복적으로합니다. 5 초마다 코드를 실행 setInterval()하려면 작업이 수행됩니다.
rcoup 2016 년

11

이전 의견을 추가하기 위해 다음과 같이 말하고 싶습니다.

setTimeout()JavaScript 의 함수는 스크립트 자체의 실행을 일시 중지하지 않고 단지 나중에 컴파일러에게 코드를 실행하도록 지시합니다.

JavaScript에 내장 된 실행을 실제로 일시 정지 할 수있는 기능은 없습니다. 그러나 함수를 사용하고 Date()필요한 시간 간격을 추가 하여 시간에 도달 할 때까지 무조건 루프와 같은 기능을 수행하는 고유 한 함수를 작성할 수 있습니다 .


11

지연 만 테스트해야하는 경우 다음을 사용할 수 있습니다.

function delay(ms) {
   ms += new Date().getTime();
   while (new Date() < ms){}
}

그리고 2 초 동안 지연하려면 다음을 수행하십시오.

delay(2000);

그러나 생산에 최고는 아닐 수도 있습니다. 코멘트에서 그것에 더


@ U2744 SNOWFLAKE 당신은 당신의 의견에 조금 더 정확하고 노력할 수 있습니까
Christoffer

1
랩톱 및 기타 모바일 장치의 배터리를 소모하고 UI가 응답하지 않거나 표시하지 못하게하는 바쁜 루프입니다.
Ry-

말이 되네요. 내가이 기능을 사용하기 위해 답변을 업데이트했습니다 :)
Christoffer

2
빠르고 더러운 (그리고 임시적인) 솔루션을 위해 개발에서 충분히 잘 작동합니다.
HumanInDisguise

5

왜 약속 뒤에 코드를 넣을 수 없습니까? (머리 꼭대기에서 입력)

new Promise(function(resolve, reject) {
  setTimeout(resolve, 2000);
}).then(function() {
  console.log('do whatever you wanted to hold off on');
});


5

간단한 대답은 다음과 같습니다.

setTimeout(
    function () {
        x = 1;
    }, 1000);

위의 함수는 1 초 (1000ms) 동안 기다린 다음 x를 1로 설정합니다. 분명히 이것은 예입니다. 익명 함수 내에서 원하는 모든 작업을 수행 할 수 있습니다.


4

나는 전화를위한 세 가지 다른 방법으로 Maurius의 설명 (가장 높은 upvoted 응답)을 정말로 좋아했습니다 setTimeout.

내 코드에서 AJAX 저장 이벤트가 완료되면 자동으로 이전 페이지로 자동 탐색하려고합니다. 저장 이벤트가 완료되면 CSS에 약간의 애니메이션이 표시되어 저장이 완료되었음을 나타냅니다.

내 코드에서 처음 두 예제 사이의 차이점을 발견했습니다.

setTimeout(window.history.back(), 3000);

이것은 타임 아웃을 기다리지 않습니다-back ()은 지연을 위해 어떤 숫자를 입력하든 거의 즉시 호출됩니다.

그러나 이것을 다음으로 변경하십시오.

setTimeout(function() {window.history.back()}, 3000);

이것은 내가 바랐던 것을 정확하게합니다.

이것은 back () 작업에만 국한된 것이 아니며에서도 마찬가지입니다 alert(). 기본적으로 alert()첫 번째 경우에 사용 된 지연 시간은 무시됩니다. 팝업을 닫으면 CSS의 애니메이션이 계속됩니다.

따라서 내장 함수를 사용하고 인수를 사용하지 않더라도 그가 설명하는 두 번째 또는 세 번째 방법을 권장합니다.


1

나는 중간에 지연을 가지고 실행하려는 일부 아약스 명령을 가지고있었습니다. 한 가지 방법으로 간단한 예를 들어 보겠습니다. 나는 비 전통적인 접근 방식을 위해 파쇄 될 준비가되어 있습니다. :)

//  Show current seconds and milliseconds
//  (I know there are other ways, I was aiming for minimal code
//  and fixed width.)
function secs()
{
    var s = Date.now() + ""; s = s.substr(s.length - 5);
  return s.substr(0, 2) + "." + s.substr(2);
}

//  Log we're loading
console.log("Loading: " + secs());

//  Create a list of commands to execute
var cmds = 
[
    function() { console.log("A: " + secs()); },
    function() { console.log("B: " + secs()); },
    function() { console.log("C: " + secs()); },
    function() { console.log("D: " + secs()); },
    function() { console.log("E: " + secs()); },
  function() { console.log("done: " + secs()); }
];

//  Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
    setTimeout(cmd, ms * i);
});

// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());

코드 블록을 복사하여 콘솔 창에 붙여 넣고 다음과 같은 것을 볼 수 있습니다.

Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076

1

지연으로 함수를 호출하는 가장 간단한 솔루션은 다음과 같습니다.

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}

0

지연 기능 :

/**
 * delay or pause for some time
 * @param {number} t - time (ms)
 * @return {Promise<*>}
 */
const delay = async t => new Promise(resolve => setTimeout(resolve, t));

async함수 내부 사용법 :

await delay(1000);

-1

다른 말로, setTimeout이 가장 안전한 방법
이지만 때로는 논리를 새로운 함수로 분리 할 수없는 경우 Date.now ()를 사용하여 밀리 초를 얻고 지연을 직접 수행 할 수 있습니다 ....

function delay(milisecondDelay) {
   milisecondDelay += Date.now();
   while(Date.now() < milisecondDelay){}
}

alert('Ill be back in 5 sec after you click OK....');
delay(5000);
alert('# Im back # date:' +new Date());

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.