문제

그래서 나는 점점 더 많이 듣기 시작했습니다 웹 직원. 나는 그것이 절대적으로 환상적이라고 생각하지만, 내가 지금까지 실제로 다루지 않은 질문은 아직 새로운 기술을 지원하지 않는 이전 브라우저를 지원하는 방법입니다.

지금까지 제가 생각해 낼 수있는 유일한 솔루션은 웹 워커 기능 주위에 일종의 래퍼를 만들어 다중 스레드 실행을 시뮬레이션하는 미친 타이머 기반 솔루션으로 돌아가는 것입니다.

그러나이 경우에도 웹 워커가 현재 JavaScript를 실행하는 브라우저의 지원되는 기능인지 여부를 어떻게 감지합니까?

감사!

도움이 되었습니까?

해결책

이것은 웹 개발의 오래된 문제입니다. 필요한 것을 지원하지 않는 브라우저에 대해해야 할 일입니다. 현재 저는 웹 작업자를 사용하여 복잡하고 장기 실행되는 작업을 위해 옹호하며 어떤 이유로 든 서버 측면을 수행 할 수 없습니다. 이런 식으로 웹 워커가 없다면 더 오래 기다립니다. 그렇지 않으면, 당신은 래퍼와 코드를 엉망으로 만들고 나중에 피하려고 할 것입니다. 페이지가로드 되 자마자 저하 전략이 발생합니다.

ONLOAD 기능 Pseudocode :

if( window.Worker /*check for support*/ )
    someObject.myFunction = function() { /*algorithm that uses Web Workers*/ }
else
    someObject.myFunction = function() { /* sad face */ }

여전히 알고리즘을 두 번 작성해야하지만 웹 워커없이 브라우저를 지원하려면 어쨌든 그렇게해야합니다. 그래서 흥미로운 질문을 제기합니다. 어떤 사람들에게는 조금 더 빨리 갈 수 있도록 시간 (그리고 돈)이 두 번 쓰는 것이 가치가 있습니까?

다른 팁

며칠 동안 이것을 씹은 후, 나는 내 블로그에 기사를 작성하게되었습니다.
http://codecube.net/2009/07/cross-platform-javaScript-webworker/

아이디어는 웹 워커가 정의되지 않은 경우 내장 기술을 사용하는 래퍼 API가 있다는 것입니다. 기사의 샘플은 매우 간단하지만 모든 브라우저에서 작동합니다 :-)

맞춤형 프로젝트에는 (그들이 부르는 것) 정면 이를 통해 웹 작업자, 기어 작업자 및 기본 스레드에서 사용할 수없는 경우 JavaScript 코드를 실행할 수 있습니다.

John Resig가 말한 내용은 다음과 같습니다 그의 블로그에 대한 의견에 답장

나는 이것에 대해 생각했다 - 그러나 그것은 까다로울 것이다. 처음부터 처리 코드를 사용하여 Settimeout/SetInterval을 사용해야합니다 (이 코드는 작업자와 일반 웹 사이트 모두에서 작동합니다). 따라서 작업자 지원 브라우저의 경우 결과가 약간 느려지지만 적어도 두 경우 모두 작동합니다.

웹 작업자 지원이없는 내 작업이 Firefox (응답하지 않는 스크립트)에서는 너무 느리지 만 다른 모든 현대식 브라우저에서는 충분히 빠릅니다. 웹 작업자와 함께 웹 작업자를 전혀 지원하지 않는 Opera (10.50)를 제외한 모든 브라우저에서 작동했지만 Opera는 그들 없이는 잘 작동했습니다.

그래서 저는 웹 워커 API를 사용할 수있을 때 사용하거나 실제 작업자 JS에 약간의 추가 기능으로 API를 위조하는 WorkerFacade를 썼습니다. 당신은 찾을 수 있습니다 Github의 요점으로서의 노동자. 나를 위해 잘 일했고, 다른 사람도 도울 수 있습니다.

modernizr (http://modernizr.com/download/#-webworkers) 브라우저가 웹 워크를 지원하는지 여부를 감지하려면 두 가지 버전이 있어야합니다. http://caniuse.com/webworkers

if(Modernizr.webworkers) 
{} 
else
{}

@geowa4

//globals
var useWorer={}
   ,noWorkerClosure=function(){...}
   ,myWorkerClosure=function(){...}
   ;
function init(){
         if(!!window.Worker){
           noWorkerClosure=null;
           useWorer=new myWorkerClosure();
         }
         else{
           useWorer=new noWorkerClosure();
           myWorkerClosure=null;
         }
}

이렇게하면 메모리 켜기를 풀고 매번 지원을 요청할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top