Pergunta

Então, eu estou começando a ouvir mais e mais sobre Web Workers . Eu acho que é absolutamente fantástico, mas a pergunta que eu não vi ninguém realmente enfrentar até agora é como apoiar os navegadores mais antigos que ainda não têm suporte para a nova tecnologia.

A única solução que eu tenho sido capaz de chegar a até agora é para fazer algum tipo de invólucro em torno da funcionalidade trabalhador web que iria cair de volta para alguma solução baseada louco temporizador que seria simular a execução de multi-threaded.

Mas, mesmo nesse caso, como é que se detectar se os trabalhadores web é um recurso suportado do navegador atualmente em execução o javascript?

Obrigado!

Foi útil?

Solução

Este é o velho problema de desenvolvimento web: o que fazer com navegadores que não suportam o que você precisa. Atualmente, eu só defendem o uso da Web Workers para, tarefas de longa execução complexas que podem ser quebrados, e por algum motivo, não pode ser server-side feito. Dessa forma, se você não tem Web Workers, você simplesmente esperar mais tempo. Caso contrário, você teria que fazer uma bagunça de seu código com invólucros e outras coisas que você vai tentar evitar mais tarde. Minha estratégia degradação acontece assim que a página é carregada.

onload função pseudo-código:

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

Você ainda tem que fazer o algoritmo duas vezes, mas você teria que fazer isso de qualquer maneira, se você quiser apoiar navegadores sem Web Workers. Assim que levanta uma questão interessante:? Vale a pena o tempo (e dinheiro) para escrever algo duas vezes, apenas para que ele possa ir um pouco mais rápido para algumas pessoas

Outras dicas

Depois de mastigar sobre isso por alguns dias, eu acabei escrevendo um artigo no meu blog:
http://codecube.net/2009/07/cross-platform-javascript -webworker /

A idéia é que nos casos em que WebWorker não está definido, existe uma API que usa apenas built-in técnicas. Embora o exemplo no artigo é muito simples, ela não funciona em todos os navegadores: -)

O projeto Bespin tem (o que eles chamam) a fachada que lhes permite executar código JavaScript na web Workers, engrenagens Trabalhadores e se aqueles que não estão disponíveis no segmento principal.

Aqui está o que John Resig disse responder a um comentário em seu blog

Eu pensei sobre isso - mas vai ser complicado. Você teria que fazer o seu processamento de utilização de código setTimeout / setInterval desde o início (este código iria acabar trabalhando tanto um trabalhador e em um site normal). Assim, enquanto o resultado seria um pouco mais lento para navegadores habilitados para trabalhadores, pelo menos, ele iria trabalhar em ambos os casos.

Eu tive o problema engraçado que a minha tarefa sem apoio Trabalhador Web foi muito lento no Firefox (roteiro sem resposta), mas rápido o suficiente em todos os outros navegadores modernos. Com Web Workers ele trabalhou em todos os navegadores exceto Opera (10,50) que não suporta Web Workers em tudo, mas Opera funcionou bem sem eles.

Então, eu escrevi um WorkerFacade que usa a API Web Worker quando disponível ou finge o API com algumas pequenas adições ao real Trabalhador JS. Você pode encontrar WorkerFacade como uma essência no GitHub . Funcionou bem para mim, poderia ajudar outra pessoa, também.

Você pode usar Modernizr ( http://modernizr.com/download/#-webworkers ) para detectar se os WebWorkers suporta navegador, em que ponto você então tem que ter duas versões ... você pode ver os navegadores com WebWorkers em 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;
         }
}

Desta forma, você libertar algum onload memória e você não precisa pedir apoio cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top