2012-05-13 7 views
2

브라우저에서 실행되는 코드 용 대화 형 디버깅 기능을 구현 중입니다. "중단 점"이 생기면 디버거를 호출하고 필요한 작업을 기다려야합니다. 물론 스크립트 실행을 위해 "계속"명령을 포함 할 수 있습니다.자바 스크립트 차단 대기

이렇게하려면 긴 폴링 기술을 사용하여 "디버그"요청을 처리하는 작은 node.js 웹 서버를 작성했습니다. 디버거 인터페이스는 다른 브라우저 창에서 실행 중이며 node.js 웹 서버와 통신하므로 명령을 다른 브라우저에서 디버깅중인 스크립트로 효과적으로 전송할 수 있습니다.

"cont" 명령을 수신 할 때 루프를 종료 할 수있는 for(;;) 루프에서 최대 N 초가 소요되는 동기 요청을 사용하여 디버깅되는 스크립트의 "정지"가 구현됩니다. 프로그래머가 제한 시간 내에 디버거 인터페이스를 사용하여 명령을 보내지 않으면 서버는 자동으로 "wait more"응답을 보내고 스크립트는 무한 루프 상태를 유지합니다.

브라우저 (이 경우 Chrome)가 잠시 후 디버깅중인 스크립트가 멈추었다는 것을 알리는 대화 상자를 표시하고이를 종료하는 옵션을 제공한다는 점을 제외하면 모든 것이 잘 작동합니다. 이것은 N의 값이 무엇이든간에 발생합니다.

브라우저를 사용하지 않고 명령을 기다리는 방법이 있습니까? 타임 아웃을 변경할 수 있습니까?

브라우저에서 프로그래밍 할 때 일반적으로 수행되는 것처럼 콜백 로직을 사용하도록 스크립트를 변경하는 것은 불가능합니다 (일반적인 프로그램에서 전체 CPS transform을 수행하는 것에 대해 이야기하고 있지 않는 한, 나는 거기에 가지 않기를 바랍니다).

답변

0

실행이 너무 많이 소요된다고 생각할 때 브라우저에서 스크립트를 죽이는 것을 막기위한 이식성 (크로스 브라우저) 방법은 없으며 일반적으로 완료된 것처럼 블로킹 작업을 구현하기 위해 중첩 된 이벤트 루프를 시작할 수 없습니다. GUI 라이브러리.

크롬을 위해 작동하는 솔루션이 바로 옵션을 사용하여 브라우저를 시작

--disable-hang-monitor 
3

방화 광과 같은 브라우저 확장 프로그램에서 사용하는 JS 디버깅 인터페이스를 사용하지 않으면 스크립트를 제대로 중단 할 수 없습니다.

현재 대기중인 상태에서 차단하는 것은 CPU 전력을 많이 소비하고 전체 브라우저 전체 브라우저를 (적어도 firefox에서는) 차단하기 때문에 현재 실제로 대기중인 상태로 차단하는 것은 정말 나쁜 생각입니다.

+0

당신은 동기 HTTP를 기다리는 요청이 CPU 전력을 많이 사용하는 얻을시겠습니까? – 6502

+0

아, 질문을 잘못 읽었습니다. 내가 (예;)를 차단할 때까지 (예; 일정한 시간이 경과했습니다. 동기식 XHR은 어느 정도 더 뛰어납니다. 여전히 일부 브라우저는 차단하지만 전부는 아니며 CPU를 낭비하지 않습니다. – ThiefMaster

+0

오 ... 오케이. 실제로 파이어 폭스에 대한 실험을했고 Chrome보다 좋게 작동합니다. 물론 CPU는 사용되지 않았지만 디버깅중인 스크립트가 완료되기 전에 DOM도 렌더링됩니다. Chrome에서는 스크립트가 실행을 마칠 때까지 다시 칠할 필요가 없습니다. – 6502

관련 문제