JS에는 수면 방법이 없습니다. 최대 절전 모드를 원한다면 메소드를 직접 정의해야합니다.
기능 수면 (Numbermillis) {var now = new Date (); var exittime = now.gettime () + 번호 millis; while (true) {now = new Date (); if (now.gettime ()> exittime) 반환; }}다음은 추가입니다.
내러티브 JS 외에도 JWACS (Advanced Continuation Support가있는 JavaScript)는 JavaScript 구문을 확장하여 번거롭게 호출되는 번거로운 비동기 기능을 작성하지 않기 위해 노력하고 있습니다. JWACS와 함께 구현 된 수면은 다음과 같습니다.
코드 사본은 다음과 같습니다.
기능 수면 (MSEC) {
var k = function_continuation;
settimeout (function () {이력서 k <-mesc;}, msec);
유예하다;
}
이 구문은 훨씬 더 무섭고 Java에서 권장되지 않는 스레드 메소드 이름입니다. 솔직히 나는 이야기 JS를 향한 경향이 있습니다.
내러티브 JS와 마찬가지로 JWACS도 사전 컴파일되어야하며 프리 컴파일러는 LISP 언어로 작성됩니다. 현재 알파 버전이기도합니다. 이 두 가지의 더 많은 소개 및 비교는 Sitepoint의 새 기사를 참조하십시오.
복잡한 JavaScript 스크립트를 작성할 때, 스크립트가 Java에서 수면 또는 SH 스크립트의 Sleep 명령에 의해 달성 된 효과와 유사하게 스크립트가 지정된 기간 동안 정지 될 수 있기를 바랍니다.
우리 모두 알다시피, JavaScript는 Java와 유사한 스레드 제어 기능을 제공하지 않습니다. 시간이 정한 실행 컨트롤을 수행 할 수있는 Settimeout과 SetInterval의 두 가지 방법이 있지만 모든 요구 사항을 충족 할 수는 없습니다. 자바 스크립트로 수면/일시 정지/대기를 구현하는 방법을 묻는 많은 사람들이 항상 있었으며 실제로 매우 절름발이 솔루션이 있습니다.
가장 쉽고 최악의 방법은 루프를 작성하는 것입니다. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
기능 수면 (Numbermillis) {
var now = 새 날짜 ();
var exittime = now.gettime () + 번호 millis;
while (true) {
지금 = 새 날짜 ();
if (now.gettime ()> exittime)
반품;
}
}
위의 코드는 실제로 스크립트 통역사를 잠들지 않으며 CPU를 빠르게 증가시키는 효과가 있습니다. 브라우저는 그 기간 동안 가짜 죽음 상태에있을 것입니다.
둘째, Smart People은 IE의 특수 대화 상자 구현을 사용하여 서로 연결합니다. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
기능 수면 (시간 초과) {
window.showmodaldialog ( "javaScript : document.writeln ( '<script> wind
} window.alert ( "수면 전 ...");
수면 (2000);
window.alert ( "수면 후 ...");
말할 것도없이, IE 지원 만 (IE7은 보안 제한으로 인해 목표를 달성 할 수 없습니다).
또한 애플릿 사용 또는 Windows 스크립트 호스트의 wscript.sleep ()와 같은 트릭도 있습니다.
마지막으로, 아마도 최고의 솔루션을 개발 한 더 똑똑한 사람들이 있습니다. 먼저 코드를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
기능 수면 (millis) {
var notifier = njsruntime.createnotifier ();
settimeout (Notifier, Millis);
Notifier.wait-> ();
}
맞습니다. -> ()의 구문을 보는 것은 프로토 타입의 $ () 함수를 보는 것처럼 놀랍습니다. 그러나이 스크립트는 브라우저에서 구문 오류를 직접보고합니다. 실제로 클라이언트 브라우저에서 승인 한 JavaScript에 사전 컴파일되어야합니다. 컴파일 된 스크립트는 다음과 같습니다.
코드 사본은 다음과 같습니다.
기능 수면 (millis) {
var njf1 = njen (이것, 논증, "millis");
NJ : (1) {
try {switch (njf1.cp) {
사례 0 : njf1._Notifier = njsruntime.createnotifier ();
settimeout (njf1._notifier, njf1._millis);
njf1.cp = 1;
njf1._notifier.wait (njf1);
반품;
사례 1 : BREAT NJ;
}} catch (ex) {
if (! njf1.excrect (예, 1))
반품;
}}
njf1.pf ();
}
나는 그것을 이해할 수없고 더 이상 그것을 이해하고 싶지 않습니다. 이러한 모든 작업은 내러티브 JavaScript에 의해 구현 될 것입니다. 우리는 이전에 이상한 -> () 구문 만 작성한 다음 전경의 사전 정전기 편집 또는 동적 편집을 통해 수면 효과를 구현하면됩니다.
내러티브 JavaScript는 현기증이 나는 콜백 기능을 해방시키고 명확한 장기 실행 작업을 작성한다고 주장합니다. 현재는 여전히 Alpha의 버전이며 예제 페이지에 이동 버튼의 예가 있습니다. 소스 코드 다운로드는 홈페이지에서도 사용할 수 있습니다. 약한 기본 지식을 통해 상태 머신의 구현이 코드에서 시뮬레이션된다는 것을 거의 알 수 없습니다. 알고리즘에 능숙한 친구들이 우리를 위해 그것을 구문 분석 할 수 있기를 바랍니다.
마지막으로, 나는 항상 내 관점을 가졌습니다. 필요하지 않으면 JavaScript를 간단하게 유지하십시오. JavaScript가 기본 스레딩 지원을 제공하기 전에 비동기 차단 응용 프로그램을 피하기 위해 설계를 변경할 수 있습니다.
버그의 구불 구불 한 구현
<스크립트 유형 "text/javaScript">/*JavaScript 자체에서 일시 정지 함수 구현 자바스크 스크립트 자체는 일시 정지 기능이 없습니다 (수면을 사용할 수 없음). JavaScript는 약한 객체 언어이며 함수는 객체로도 사용할 수 있습니다. 예 : [code] function test () {alert ( "Hellow"); this.nextStep = function () {alert ( "NextStep"); }} var mytest = new test ()를 호출 할 수 있습니다. myTest.nextStep (); 일시 중지 할 때 함수는 두 부분으로 나눌 수 있고, 일시 정지 작업 전 변경되지 않은 상태로, this.nextStep에서 일시 중지 후 코드를 실행할 수 있습니다. 일시 정지 및 연속을 제어하려면 각각 일시 정지 및 연속 기능을 구현하기 위해 두 가지 기능을 작성해야합니다. 일시 정지 함수는 다음과 같습니다. */function pasion (obj, iminsecond) {if (wind var ind = -1; for (var i = 0; i <window.eventList.length; i ++) {if (wind ind = i; 부서지다; }} if (ind == -1) {ind = window.eventList.length; Window.eventList [ind] = obj; } settimeout ( "goon (" + ind + ")", 1000);}/*이 함수는 함수를 배열 창에 일시 정지시킵니다. EventList는 동시에 settimeout을 통해 지속적인 기능을 호출합니다. 연속 함수는 다음과 같습니다. */function goon (ind) {var obj = window.eventList [ind]; Window.eventList [ind] = null; if (obj.nextStep) obj.nextStep (); else obj ();}/*이 함수는 매달린 함수의 다음 단계 메소드를 호출합니다. 이 메소드를 사용할 수 없으면 함수가 다시 호출됩니다. 함수가 작성된 후 다음 볼륨을 쓸 수 있습니다. */function test () {alert ( "Hellow"); 일시 정지 (this, 1000); // 일시 정지 함수를 호출 this.nextStep = function () {alert ( "nextstep"); }} </script>