질문자 :Community Wiki
다음 pausecomp 함수( here 에서 pausecomp
보다 JavaScript sleep
를 설계하는 더 좋은 방법이 있습니까?
function pausecomp(millis) { var date = new Date(); var curDate = null; do { curDate = new Date(); } while(curDate-date < millis); }
이것은 JavaScript의 Sleep의 복제본이 아닙니다. 작업 사이의 지연입니다. 나는 코드 조각이 실행되기 전에 지연이 아니라 함수 중간에 진짜 잠을 원합니다.
2017 — 2021 업데이트
이 질문을 받은 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));
참고로,
-
await
async
키워드가 접두사로 붙은 함수에서만 실행할 수 있습니다 . 또는 점점 더 많은 환경 에서 스크립트의 최상위 수준에서 실행할 수 있습니다. -
await
async
기능만 일시 중지합니다. 이것은 대부분의 경우에 원하는 나머지 스크립트의 실행을 차단하지 않는다는 것을 의미합니다. 차단 구성을 원하면 Atomics
.wait
사용하여 이 답변 을 참조하십시오. 그러나 대부분의 브라우저는 브라우저의 기본 스레드에서 이를 허용하지 않습니다.
두 가지 새로운 JavaScript 기능(2017년 기준)은 이 "잠자기" 기능을 작성하는 데 도움이 되었습니다.
호환성
당신이 (도달 노드보다 오래된 7 사용하고 어떤 이상한 이유로 경우 의 수명을 ), 또는 오래된 브라우저를 대상으로, async
/ await
여전히를 통해 사용할 수 있습니다 바벨 (도구를 것 transpile 평범한 구식으로 자바 스크립트 + 새로운 기능을 JavaScript), transform-async-to-generator
플러그인 사용.
Dan Dascalescu( 2016년 업데이트된 답변 참조)
어떤 행동을 하고, 기다렸다가 다른 행동을 하고 싶은 것이 지극히 합리적이라고 생각합니다. 다중 스레드 언어로 작성하는 데 익숙하다면 스레드가 깨어날 때까지 정해진 시간 동안 실행을 양보하는 아이디어가 있을 것입니다.
여기서 문제는 JavaScript가 단일 스레드 이벤트 기반 모델이라는 것입니다. 특정한 경우에는 전체 엔진이 몇 초 동안 기다리게 하는 것이 좋을 수 있지만 일반적으로 나쁜 습관입니다. 내 자신의 기능을 작성하는 동안 귀하의 기능을 사용하고 싶었다고 가정해 봅시다. 내가 당신의 방법을 호출했을 때, 내 방법은 모두 멈췄을 것입니다. JavaScript가 함수의 실행 컨텍스트를 어떻게든 보존할 수 있다면 어딘가에 저장한 다음 다시 가져와 나중에 계속하면 절전이 발생할 수 있지만 이는 기본적으로 스레딩입니다.
그래서 당신은 다른 사람들이 제안한 것에 거의 집착하고 있습니다. 당신은 당신의 코드를 여러 기능으로 나누어야 할 것입니다.
귀하의 질문은 약간 잘못된 선택입니다. 당신이 원하는 방식으로 잠을 잘 방법은 없으며 당신이 제안한 솔루션을 추구해서는 안됩니다.
Community WikiJavaScript에서는 가능한 한 빨리 끝날 수 있도록 모든 함수를 다시 작성합니다. 브라우저가 DOM을 변경할 수 있도록 다시 제어하기를 원합니다.
함수 중간에 잠자기를 원할 때마다 setTimeout()
을 사용하도록 리팩토링했습니다.
편집하다
어떤 언어에서든 악명 높은 수면 또는 지연 기능에 대해서는 많은 논란이 있습니다. 어떤 사람들은 주어진 기능을 실행하기 위해 항상 신호나 콜백이 있어야 한다고 말할 것이고, 다른 사람들은 때때로 임의의 지연 시간이 유용하다고 주장할 것입니다. 나는 그들 각자에게 하나의 규칙이 이 업계에서 어떤 것도 지시할 수 없다고 말합니다.
sleep 함수를 작성하는 것은 간단하며 JavaScript Promise를 사용하면 훨씬 더 유용하게 사용할 수 있습니다.
// sleep time expects milliseconds function sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); } // Usage! sleep(500).then(() => { // Do something after the sleep! });
Community WikiFirebug (및 아마도 다른 JavaScript 콘솔)에서 Enter 키를 누른 후에는 지정된 절전 시간(...) 후에만 아무 일도 일어나지 않습니다.
function sleepFor(sleepDuration){ var now = new Date().getTime(); while(new Date().getTime() < now + sleepDuration){ /* Do nothing */ } }
사용 예:
function sleepFor(sleepDuration){ var now = new Date().getTime(); while(new Date().getTime() < now + sleepDuration){ /* Do nothing */ } } function sleepThenAct(){ sleepFor(2000); console.log("Hello, JavaScript sleep!"); } sleepThenAct()
참고: 디버깅 및 개발 전용
Community Wiki다른 포스터에 동의합니다. 바쁜 잠은 좋지 않습니다.
그러나 setTimeout은 실행을 보류하지 않습니다. 시간 초과가 만료된 후가 아니라 시간 초과가 설정된 직후 함수의 다음 줄을 실행하므로 절전 모드에서 수행하는 것과 동일한 작업을 수행하지 않습니다.
이를 수행하는 방법은 기능을 전후 부분으로 분해하는 것입니다.
function doStuff() { // Do some things setTimeout(continueExecution, 10000) // Wait ten seconds before continuing } function continueExecution() { // Finish doing things after the pause }
함수 이름이 여전히 각 부분이 수행하는 작업을 정확하게 설명하는지 확인하십시오(예: funcPart1 및 funcPart2가 아닌 GatherInputThenWait 및 CheckInput).
이 방법은 여전히 대기하고있다 어떤 다른 실행하는 클라이언트 PC로 제어 다시 돌아 오는 동안, 당신이 당신의 제한 시간이 끝날 때까지 결정하는 코드 줄을 실행하지의 목적을 달성 할 수있다.
주석에서 지적했듯이 이것은 루프에서 절대 작동하지 않습니다. 루프에서 작동하도록 멋진(못생긴) 해킹을 수행할 수 있지만 일반적으로 그것은 비참한 스파게티 코드를 만들 뿐입니다.
Community Wiki$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을 사용하여 매초 텍스트를 표시하고 숨기는 방법을 보여줍니다.
Community Wiki(나처럼) 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. */ }
Community WikijQuery를 사용하는 경우 누군가 실제로 setTimeout에 대한 래퍼에 불과한 "지연" 플러그인을 만들었습니다.
// Delay Plugin for jQuery // - http://www.evanbot.com // - © 2008 Evan Byrne jQuery.fn.delay = function(time,func){ this.each(function(){ setTimeout(func,time); }); return this; };
그런 다음 예상대로 함수 호출 행에서 사용할 수 있습니다.
$('#warning') .addClass('highlight') .delay(1000) .removeClass('highlight');
Community Wiki수면 솔루션도 검색했는데(프로덕션 코드가 아닌 개발 및 테스트용) 이 기사를 찾았습니다.
자바스크립트 sleep() 또는 wait()
...그리고 여기에 클라이언트 측 솔루션에 대한 또 다른 기사가 있습니다. JavaScript sleep
alert()
호출할 때 경고가 표시되는 동안 코드도 일시 중지됩니다. 경고를 표시하지 않지만 동일한 효과를 얻을 수 있는 방법을 찾아야 합니다. :)
Community Wiki사용하다:
await new Promise(resolve => setTimeout(resolve, 2000));
호출 함수가 비동기인지 확인하십시오. 이것은 확인되었으며 잘 작동합니다.
Community Wiki여기 있습니다. 코드에서 알 수 있듯이 나쁜 개발자가 되지 말고 웹사이트에서 이것을 사용하세요. 개발 유틸리티 기능입니다.
// Basic sleep function based on ms. // DO NOT USE ON PUBLIC FACING WEBSITES. function sleep(ms) { var unixtime_ms = new Date().getTime(); while(new Date().getTime() < unixtime_ms + ms) {} }
Community Wiki다음은 동기 XMLHttpRequest를 사용하는 간단한 솔루션입니다.
function sleep(n){ var request = new XMLHttpRequest(); request.open('GET', '/sleep.php?n=' + n, false); // `false` makes the request synchronous request.send(null); }
sleep.php 파일의 내용:
<?php sleep($_GET['n']);
이제 다음과 같이 호출하십시오.
sleep(5);
Community Wiki첫 번째:
다음과 같이 실행하려는 함수를 정의합니다.
function alertWorld(){ alert("Hello, World!"); }
그런 다음 setTimeout 메서드를 사용하여 실행을 예약합니다.
setTimeout(alertWorld, 1000)
두 가지를 참고하세요
- 두 번째 인수는 밀리초 단위의 시간입니다.
- 첫 번째 인수로 괄호 없이 함수의 이름(참조)만 전달해야 합니다.
Community Wiki나는 개인적으로 단순한 것을 좋아한다:
function sleep(seconds){ var waitUntil = new Date().getTime() + seconds*1000; while(new Date().getTime() < waitUntil) true; }
그 다음에:
sleep(2); // Sleeps for 2 seconds
나는 p5.js 에서 스크립트를 생성하는 동안 가짜 로드 시간을 생성하기 위해 항상 그것을 사용하고 있습니다.
Community Wiki대부분의 사람들이 원하는 것처럼 보이게 하는 더 나은 솔루션은 익명 함수를 사용하는 것입니다.
alert('start'); var a = 'foo'; // Lots of code setTimeout(function(){ // Beginning of code that should run AFTER the timeout alert(a); // Lots more code }, 5000); // Put the timeout here
이것은 아마도 단순히 원하는 것을 수행하는 것에 가장 가깝습니다.
여러 번의 수면이 필요한 경우 이 작업이 급하게 나빠질 수 있으며 실제로 디자인을 재고해야 할 수도 있습니다.
Community WikiAtomics.wait를 사용한 2019 업데이트
Node.js 9.3 이상에서 작동해야 합니다.
나는 Node.js에서 꽤 정확한 타이머가 필요했고 그것을 위해 잘 작동합니다.
그러나 브라우저에서 지원하는 것이 극히 제한적인 것 같습니다.
let ms = 10000; Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
몇 가지 10초 타이머 벤치마크를 실행했습니다.
setTimeout을 사용하면 최대 7000마이크로초(7ms)의 오류가 발생합니다.
Atomics를 사용하면 오류가 600마이크로초(0.6ms) 미만으로 유지되는 것 같습니다.
2020 업데이트: 요약
function sleep(millis){ // Need help of a server-side page let netMillis = Math.max(millis-5, 0); // Assuming 5 ms overhead let xhr = new XMLHttpRequest(); xhr.open('GET', '/sleep.jsp?millis=' + netMillis + '&rand=' + Math.random(), false); try{ xhr.send(); }catch(e){ } } function sleepAsync(millis){ // Use only in async function let netMillis = Math.max(millis-1, 0); // Assuming 1 ms overhead return new Promise((resolve) => { setTimeout(resolve, netMillis); }); } function sleepSync(millis){ // Use only in worker thread, currently Chrome-only Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, millis); } function sleepTest(){ console.time('sleep'); sleep(1000); console.timeEnd('sleep'); } async function sleepAsyncTest(){ console.time('sleepAsync'); await sleepAsync(1000); console.timeEnd('sleepAsync'); } function sleepSyncTest(){ let source = `${sleepSync.toString()} console.time('sleepSync'); sleepSync(1000); console.timeEnd('sleepSync');`; let src = 'data:text/javascript,' + encodeURIComponent(source); console.log(src); var worker = new Worker(src); }
그 중 서버 측 페이지(예: sleep.jsp
)는 다음과 같습니다.
<% try{ Thread.sleep(Long.parseLong(request.getParameter("millis"))); }catch(InterruptedException e){} %>
Community Wiki종속성이 없는 최단 솔루션:
await new Promise(resolve => setTimeout(resolve, 5000));
Community Wiki여기에 있는 대부분의 답변은 잘못되었거나 최소한 구식입니다. JavaScript가 단일 스레드여야 하는 이유는 없으며 실제로는 그렇지 않습니다. 오늘날 모든 주류 브라우저는 작업자를 지원합니다. 이전에는 Rhino 및 Node.js와 같은 다른 JavaScript 런타임이 멀티스레딩을 지원했습니다.
'JavaScript는 단일 스레드입니다'는 유효한 대답이 아닙니다. 예를 들어 작업자 내에서 절전 기능을 실행하면 UI 스레드에서 실행되는 코드가 차단되지 않습니다.
생성기와 수율을 지원하는 최신 런타임에서는 단일 스레드 환경의 절전 기능과 유사한 기능을 가져올 수 있습니다.
// This is based on the latest ES6 drafts. // JavaScript 1.7+ (SpiderMonkey/Firefox 2+) syntax is slightly different // Run code you want to sleep here (omit star if using JavaScript 1.7) function* main(){ for (var i = 0; i < 10; i++) { // To sleep for 10 milliseconds 10 times in a row yield 10; } yield 5; console.log('I just slept 5 milliseconds!'); } // Resume the given generator after ms milliseconds function resume(ms, generator){ setTimeout(function(){ // Omit .value if using JavaScript 1.7 var nextSleep = generator.next().value; resume(nextSleep, generator); }, ms); } // Initialize a generator and get first sleep for the recursive function var generator = main(), firstSleep = generator.next().value; // Initialize recursive resume function resume(firstSleep, generator);
이 수면 모방은 스레드를 차단하지 않는다는 점에서 진정한 수면 기능과 다릅니다. JavaScript의 현재 setTimeout 기능 위에 있는 단순한 설탕입니다. 이 기능 유형은 Task.js 에서 구현되었으며 현재 Firefox에서 작동합니다.
Community Wiki브라우저의 경우 setTimeout 및 setInterval이 올바른 방법이라는 데 동의합니다.
그러나 서버 측 코드의 경우 차단 기능이 필요할 수 있습니다(예: 스레드 동기화를 효과적으로 수행할 수 있음).
Node.js 및 Meteor 를 사용하는 경우 광섬유에서 setTimeout을 사용하는 데 제한이 있을 수 있습니다. 다음은 서버 측 절전 코드입니다.
var Fiber = require('fibers'); function sleep(ms) { var fiber = Fiber.current; setTimeout(function() { fiber.run(); }, ms); Fiber.yield(); } Fiber(function() { console.log('wait... ' + new Date); sleep(1000); console.log('ok... ' + new Date); }).run(); console.log('back in main');
참조: Node.js 섬유, 수면
Community Wiki다른 비동기 작업과의 코드 일관성을 위해 Promise에 setTimeOut을 캡슐화합니다. Demo in Fiddle
function sleep(ms) { return(new Promise(function(resolve, reject) { setTimeout(function() { resolve(); }, ms); })); }
다음과 같이 사용됩니다.
sleep(2000).then(function() { // Do something });
Promises 사용에 익숙하다면 구문을 기억하기 쉽습니다.
Community Wiki나는 JavaScript sleep/wait에 대해 꽤 많은 웹 페이지를 검색/구글링했는데... JavaScript가 "RUN, DELAY, RUN"되도록 하려면 대답이 없습니다 ... 대부분의 사람들이 얻은 것은 "RUN, RUN(쓸모 물건), RUN" 또는 "RUN, RUN + 지연된 RUN"...
생각: 여기 작동하는 솔루션이 있습니다... 하지만 실행 중인 코드를 잘라야 합니다...: 예, 압니다. 리팩토링을 읽기가 더 쉽습니다... 여전히...
예 1:
<html> <body> <div id="id1">DISPLAY</div> <script> // JavaScript sleep by "therealdealsince1982"; copyrighted 2009 // setInterval var i = 0; function run() { // Pieces of codes to run if (i == 0){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; } if (i == 1){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; } if (i == 2){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; } if (i >2){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; } if (i == 5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } // End interval, stops run i++; // Segment of code finished running, next... } run(); t = setInterval("run()", 1000); </script> </body> </html>
예 2:
<html> <body> <div id="id1">DISPLAY</div> <script> // JavaScript sleep by "therealdealsince1982"; copyrighted 2009 // setTimeout var i = 0; function run() { // Pieces of codes to run, can use switch statement if (i == 0){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>"; sleep(1000);} if (i == 1){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>"; sleep(2000);} if (i == 2){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>"; sleep(3000);} if (i == 3){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>";} //stops automatically i++; } function sleep(dur) {t=setTimeout("run()", dur);} // Starts flow control again after 'dur' run(); // Starts </script> </body> </html>
예 3:
<html> <body> <div id="id1">DISPLAY</div> <script> // JavaScript sleep by "therealdealsince1982"; copyrighted 2009 // setTimeout var i = 0; function flow() { run(i); i++; // Code segment finished running, increment i; can put elsewhere sleep(1000); if (i == 5) {clearTimeout(t);} // Stops flow, must be after sleep() } function run(segment) { // Pieces of codes to run, can use switch statement if (segment == 0){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } if (segment == 1){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } if (segment == 2){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; } } function sleep(dur) {t=setTimeout("flow()", dur);} // Starts flow control again after 'dur' flow(); // Starts flow </script> </body> </html>
예 4:
<html> <body> <div id="id1">DISPLAY</div> <script> // JavaScript sleep by "therealdealsince1982"; copyrighted 2009 // setTimeout, switch var i = 0; function flow() { switch(i) { case 0: run(i); sleep(1000); break; case 1: run(i); sleep(2000); break; case 5: run(i); clearTimeout(t); // Stops flow break; default: run(i); sleep(3000); break; } } function run(segment) { // Pieces of codes to run, can use switch statement if (segment == 0){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } if (segment == 1){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } if (segment == 2){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; } i++; // Current segment of code finished running, next... } function sleep(dur) {t=setTimeout("flow()", dur);} // Starts flow control again after 'dur' flow(); // Starts flow control for first time... </script> </body> </html>
Community Wiki동기 실행을 처리해야 하는 경우 절전 기능의 목적을 이해할 수 있습니다. setInterval 및 setTimeout 함수는 실행 순서를 주 프로그램으로 다시 반환하는 병렬 실행 스레드를 생성합니다. 이는 주어진 결과를 기다려야 하는 경우에는 효과가 없습니다. 물론 이벤트와 핸들러를 사용할 수도 있지만 어떤 경우에는 의도한 것과 다릅니다.
Community Wikifunction sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ break; } } }
Community WikisetTimeout
및 setInterval
보다 덜 투박한 함수를 원하면 인수의 순서를 반대로 하고 멋진 이름을 지정하는 함수로 이들을 래핑할 수 있습니다.
function after(ms, fn){ setTimeout(fn, ms); } function every(ms, fn){ setInterval(fn, ms); }
CoffeeScript 버전:
after = (ms, fn)-> setTimeout fn, ms every = (ms, fn)-> setInterval fn, ms
그런 다음 익명 함수와 함께 멋지게 사용할 수 있습니다.
after(1000, function(){ console.log("it's been a second"); after(1000, function(){ console.log("it's been another second"); }); });
이제 "N 밀리초 후 ..."(또는 "N 밀리초마다 ...")로 쉽게 읽힙니다.
Community WikiNode.js 7.6부터 utils 모듈 promisify
함수를 setTimeout
과 결합할 수 있습니다.
const sleep = require('util').promisify(setTimeout)
일반적인 사용법
async function main() { console.time("Slept for") await sleep(3000) console.timeEnd("Slept for") } main()
질문 사용법
async function asyncGenerator() { while (goOn) { var fileList = await listFiles(nextPageToken); await sleep(3000) var parents = await requestParents(fileList); } }
Community WikiJavaScript에서는 이와 같이 잠자기를 할 수 없으며, 오히려 해서는 안 됩니다. sleep 또는 while 루프를 실행하면 루프가 완료될 때까지 사용자의 브라우저가 중단됩니다.
참조한 링크에 지정된 대로 타이머를 사용하십시오.
Community WikisetTimeout()을 사용하는 대신 sleep() 함수를 원할 수 있는 한 가지 시나리오는 사용자 클릭에 응답하여 궁극적으로 새 팝업 창을 여는 함수가 있고 짧은 시간이 필요한 일부 처리를 시작한 경우입니다. 팝업이 표시되기 전에 완료합니다. 열린 창을 클로저로 옮기는 것은 일반적으로 브라우저에 의해 차단된다는 것을 의미합니다.
Community WikiJava의 절전 방법을 사용하여 수행할 수 있습니다. Firefox와 Internet Explorer에서 테스트했는데 컴퓨터를 잠그거나 리소스를 씹지 않거나 끝없는 서버 히트를 일으키지 않습니다. 그것은 나에게 깨끗한 해결책처럼 보입니다.
먼저 Java를 페이지에 로드하고 해당 메소드를 사용할 수 있도록 해야 합니다. 그렇게 하기 위해 다음과 같이 했습니다.
<html> <head> <script type="text/javascript"> function load() { var appletRef = document.getElementById("app"); window.java = appletRef.Packages.java; } // endfunction </script> <body onLoad="load()"> <embed id="app" code="java.applet.Applet" type="application/x-java-applet" MAYSCRIPT="true" width="0" height="0" />
그런 다음 JavaScript 코드에서 고통 없는 일시 중지를 원할 때 해야 할 일은 다음과 같습니다.
java.lang.Thread.sleep(xxx)
여기서 xxx는 밀리초 단위의 시간입니다. 제 경우에는(정당화를 위해) 아주 작은 회사에서 백엔드 주문 처리의 일부였으며 서버에서 로드해야 하는 인보이스를 인쇄해야 했습니다. 나는 인보이스를 (웹 페이지로) iFrame에 로드한 다음 iFrame을 인쇄하여 이를 수행했습니다.
물론 인쇄하기 전에 페이지가 완전히 로드될 때까지 기다려야 했기 때문에 JavaScript 코드가 일시 중지되어야 했습니다. iFrame의 인보이스 페이지에서 onLoad 이벤트를 사용하여 상위 페이지의 숨겨진 양식 필드를 변경하도록 하여 이 작업을 수행했습니다. 그리고 인보이스를 인쇄하기 위한 상위 페이지의 코드는 다음과 같습니다(명확성을 위해 관련 없는 부분은 잘라냈습니다).
var isReady = eval('document.batchForm.ready'); isReady.value = 0; frames['rpc_frame'].location.href = url; while (isReady.value == 0) { java.lang.Thread.sleep(250); } // endwhile window.frames['rpc_frame'].focus(); window.frames['rpc_frame'].print();
따라서 사용자가 버튼을 누르면 스크립트가 송장 페이지를 로드하고 대기하면서 매 분기마다 송장 페이지 로드가 완료되었는지 확인한 다음 사용자가 프린터로 보낼 수 있도록 인쇄 대화 상자를 팝업합니다. QED.
Community WikiNode.js 를 사용 중이라면 섬유를 살펴볼 수 있습니다. 이는 일종의 멀티 스레딩 시뮬레이션인 노드에 대한 기본 C 확장입니다.
sleep
을 수행할 수 있지만 주 스레드 및 기타 광섬유에서는 차단되지 않습니다.
다음은 자체 readme에서 가져온 예입니다.
// sleep.js var Fiber = require('fibers'); function sleep(ms) { var fiber = Fiber.current; setTimeout(function() { fiber.run(); }, ms); Fiber.yield(); } Fiber(function() { console.log('wait... ' + new Date); sleep(1000); console.log('ok... ' + new Date); }).run(); console.log('back in main');
– 결과는 다음과 같습니다.
$ node sleep.js wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST) back in main ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Community Wiki루프에 의해 실행되는 일련의 호출에 간격을 두고자 하는 특정 경우에 프로토타입과 함께 아래 코드와 같은 것을 사용할 수 있습니다. 프로토타입이 없으면 지연 기능을 setTimeout으로 대체할 수 있습니다.
function itemHandler(item) { alert(item); } var itemSet = ['a','b','c']; // Each call to itemHandler will execute // 1 second apart for(var i=0; i<itemSet.length; i++) { var secondsUntilExecution = i; itemHandler.delay(secondsUntilExecution, item) }
Community Wiki출처 : http:www.stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep