[javascript] sleep ()의 JavaScript 버전은 무엇입니까?

sleep다음 pausecomp함수 ( 여기에서 가져온 것)보다 JavaScript에서을 엔지니어링하는 더 좋은 방법이 있습니까?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

이것은 JavaScript에서 Sleep 의 복제본이 아닙니다 -동작 사이의 지연 ; 함수 중간에 실제로 잠을 자고 코드 조각이 실행되기 전에 지연되지 않기를 원합니다 .



답변

2017 — 2019 업데이트

이 질문이 제기 된 2009 년 이후로 JavaScript는 크게 발전했습니다. 다른 모든 답변은 이제 더 이상 사용되지 않거나 지나치게 복잡합니다. 현재 모범 사례는 다음과 같습니다.

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  for (let i = 0; i < 5; i++) {
    if (i === 3)
      await sleep(2000);
    console.log(i);
  }
}

demo();

이거 야. await sleep(<duration>).

또는 단일 라이너로 :

await new Promise(r => setTimeout(r, 2000));

참고

  1. awaitasync키워드가 접두사로 사용 되거나 일부 환경 (예 : Chrome DevTools 콘솔 또는 Runkit)에서 스크립트 의 최상위 수준 에서만 실행될 수 있습니다 .
  2. await현재 async기능 만 일시 정지

두 가지 새로운 JavaScript 기능이이 “잠자기”기능을 작성하는 데 도움이되었습니다.

적합성

당신이 (도달 노드보다 오래된 7 사용하고 어떤 이상한 이유로 경우 의 수명을 ), 또는 오래된 브라우저를 대상으로, async/ await여전히를 통해 사용할 수 있습니다 바벨 (도구를 것 transpile 평범한 구식 자바 스크립트로 자바 스크립트 + 새로운 기능) transform-async-to-generator플러그인 과 함께 .


답변

( 2016 년 업데이트 된 답변 참조 )

나는 행동을하고, 기다렸다가 다른 행동을하는 것이 타당하다고 생각합니다. 다중 스레드 언어로 작성하는 데 익숙하다면 스레드가 깨어날 때까지 일정 시간 동안 실행을 수행 할 수 있습니다.

여기서 문제는 JavaScript가 단일 스레드 이벤트 기반 모델이라는 것입니다. 특정한 경우 전체 엔진을 몇 초 동안 기다리게하는 것이 좋을 수 있습니다. 일반적으로 나쁜 습관입니다. 직접 작성하는 동안 함수를 사용하고 싶다고 가정 해보십시오. 내가 당신의 방법을 불렀을 때, 나의 방법은 모두 얼어 붙었습니다. JavaScript가 어떻게 든 함수의 실행 컨텍스트를 보존하고 어딘가에 저장 한 다음 다시 가져와 나중에 계속하면 절전 모드가 발생할 수 있지만 기본적으로 스레딩입니다.

따라서 다른 사람들이 제안한 내용에 거의 얽매이지 않습니다. 코드를 여러 기능으로 나누어야합니다.

그렇다면 귀하의 질문은 약간 잘못된 선택입니다. 원하는 방식으로 잠을 자거나 방법을 제안해서는 안됩니다.


답변

JavaScript에서는 가능한 빨리 종료 할 수 있도록 모든 함수를 다시 작성합니다. 브라우저를 다시 제어하여 DOM을 변경할 수 있습니다.

함수 중간에 수면을 원할 때마다을 사용하도록 리팩토링했습니다 setTimeout().

편집하다

모든 언어 내에서 악명 높은 수면 또는 지연 기능이 많이 논의되고 있습니다. 어떤 사람들은 주어진 기능을 발생시키기 위해 항상 신호 나 콜백이 있어야한다고 말하고 어떤 사람들은 때때로 임의의 지연 순간이 유용하다고 주장 할 것입니다. 나는 그들 자신과 하나의 규칙이 결코이 산업의 어떤 것도 지시 할 수 없다고 말합니다.

JavaScript 기능으로 수면 기능 작성이 간단하고 더욱 유용합니다.

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// Usage!
sleep(500).then(() => {
    // Do something after the sleep!
});


답변

debug / dev 만 누군가에게 유용하다면 이것을 게시합니다.

Firebug (및 아마도 다른 js 콘솔)에서 흥미로운 것들은 지정된 수면 시간 후에 만 ​​Enter 키를 누른 후에는 아무 일도 일어나지 않습니다 (…)

function sleepFor( sleepDuration ){
    var now = new Date().getTime();
    while(new Date().getTime() < now + sleepDuration){ /* do nothing */ }
}

사용 예 :

function sleepThenAct(){ sleepFor(2000); console.log("hello js sleep !"); }


답변

나는 다른 포스터에 동의합니다. 바쁜 수면은 나쁜 생각입니다.

그러나 setTimeout은 실행을 보류하지 않으며 시간 종료가 만료 된 후가 아니라 시간 종료가 SET 직후에 다음 함수 행을 실행하므로 휴면과 동일한 태스크를 수행 할 수 없습니다.

이를 수행하는 방법은 부품을 부품 전후로 분류하는 것입니다.

function doStuff()
{
  //do some things
  setTimeout(continueExecution, 10000) //wait ten seconds before continuing
}

function continueExecution()
{
   //finish doing things after the pause
}

함수 이름이 각 부분이 수행하는 작업을 정확하게 설명하는지 확인하십시오 (예 : funcPart1 및 funcPart2가 아닌 IE GatherInputThenWait 및 CheckInput).

편집하다

이 방법은 제한 시간이 지나면 결정한 코드 줄을 실행하지 않고 큐에 대기 한 다른 항목을 실행하기 위해 클라이언트 PC로 다시 제어를 되 돌리는 목적을 달성합니다.

추가 편집

주석에서 지적했듯이 이것은 루프에서 절대 작동하지 않습니다. 루프에서 작동하도록 멋진 (추악한) 해킹을 수행 할 수는 있지만 일반적으로 비참한 스파게티 코드를 만들 것입니다.


답변

$ DEITY를 사랑하기 위해 바쁘게 기다리는 수면 기능을 만들지 마십시오. setTimeout그리고 setInterval당신이 필요로하는 모든 것을 할.

var showHide = document.getElementById('showHide');
setInterval(() => {
    showHide.style.visibility = "initial";
    setTimeout(() => {
        showHide.style.visibility = "hidden"
    }, 1000);
    ;
}, 2000);   
<div id="showHide">Hello! Goodbye!</div>

2 초 간격마다 1 초 동안 텍스트가 숨겨집니다. setInterval 및 setTimeout을 사용하여 매초마다 텍스트를 표시하고 숨기는 방법을 보여줍니다.


답변

나는 이것이 오래된 질문이라는 것을 알고 있지만 (나 같은) Rhino와 함께 Javascript를 사용하고 있다면 사용할 수 있습니다 …

try
{
  java.lang.Thread.sleep(timeInMilliseconds);
}
catch (e)
{
  /*
   * This will happen if the sleep is woken up - you might want to check
   * if enough time has passed and sleep again if not - depending on how
   * important the sleep time is to you.
   */
}