Pregunta

Así que estoy empezando a escuchar más y más información acerca de Web trabajadores . Creo que es absolutamente fantástico, pero la pregunta que no he visto a nadie realmente hacer frente hasta ahora es cómo apoyar a los navegadores antiguos que aún no cuentan con el apoyo a la nueva tecnología.

La única solución que he sido capaz de llegar a lo que va a hacer es una especie de envoltura alrededor de la funcionalidad trabajador web que caería de nuevo a alguna solución basada en temporizador loca que simular la ejecución de subprocesos múltiples.

Pero incluso en ese caso, ¿cómo se puede detectar si los trabajadores web es una característica compatible del navegador que se está ejecutando el código JavaScript?

Gracias!

¿Fue útil?

Solución

Este es el viejo problema del desarrollo web: qué hacer con los navegadores que no soportan lo que necesita. Actualmente, sólo defienden el uso de Web Workers para tareas complejas, de larga duración que puede ser roto, y por alguna razón, no se puede hacer del lado del servidor. De esta manera, si usted no tiene Trabajadores web, sólo tiene que esperar más tiempo. De lo contrario, tendría que hacer un lío de su código con envolturas y otras cosas que usted va a tratar de evitar más tarde. Mi estrategia degradación tiene lugar tan pronto como se carga la página.

función onload pseudocódigo:

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

Usted todavía tiene que escribir el algoritmo dos veces, pero que tendría que hacer eso de todos modos si quieres apoyar a los navegadores web sin trabajadores. Así que eso plantea una pregunta interesante: ¿merece la pena el tiempo (y dinero) para escribir algo dos veces, sólo por lo que puede ir un poco más rápido para algunas personas

Otros consejos

Después de masticar en esto durante unos días, terminé escribiendo un artículo en mi blog:
http://codecube.net/2009/07/cross-platform-javascript -webworker /

La idea es que en los casos en WebWorker no está definida, hay una API envoltorio que sólo utiliza técnicas incorporadas. Aunque la muestra en el artículo es muy simple, funciona en todos los navegadores: -)

El proyecto tiene Bespin (lo que ellos llaman) un fachada que les permite ejecutar código JavaScript en web Workers, Engranajes Trabajadores y si aquellos que no están disponibles en el hilo principal.

Esto es lo que dijo John Resig respondiendo a un comentario en su blog

  

pensé en esto - pero será complicado. Usted tendría que hacer su código de procesamiento de uso setTimeout / setInterval desde el principio (el código terminaría trabajando tanto en un trabajador y en un sitio web normal). Así, mientras que el resultado sería un poco más lento para los navegadores de los trabajadores habilitados al menos sería trabajar en ambos casos.

Yo tenía el problema divertida que mi tarea sin ayuda Web Worker era demasiado lento en Firefox (secuencia de comandos no responde), pero lo suficientemente rápido como en todos los demás navegadores modernos. Con Web Workers funcionó en todos los navegadores excepto Opera (10.50) que no soporta Web Workers en absoluto, pero Opera funcionó bien sin ellos.

Así que escribió un WorkerFacade que utiliza la API Web Worker cuando esté disponible o falsifica la API con algunas adiciones menores al trabajador real JS. Puede encontrar WorkerFacade como una esencia en GitHub . Funcionado bien para mí, podría ayudar a alguien más, también.

Puede utilizar Modernizr ( http://modernizr.com/download/#-webworkers ) para detectar si el navegador es compatible con webworkers, momento en el que se tiene que tener dos versiones ... puede ver los navegadores con webworkers a 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;
         }
}

De esta manera se libera algo de memoria y proceso de carga no es necesario pedir el apoyo cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top