Question

Alors je commence à entendre de plus en plus sur Web Workers . Je pense qu'il est absolument fantastique, mais la question que je ne l'ai pas vu quelqu'un attaquer vraiment à ce jour est de savoir comment soutenir les anciens navigateurs qui ne sont pas compatibles avec la nouvelle technologie.

La seule solution que je suis en mesure de trouver à ce jour est de faire une sorte d'emballage autour de la fonctionnalité des travailleurs Web qui retomberait à une solution de minuterie fou qui simulerait l'exécution multi-thread.

Mais même dans ce cas, comment peut-on détecter si les travailleurs web est une fonctionnalité prise en charge du navigateur en cours d'exécution du javascript?

Merci!

Était-ce utile?

La solution

Ceci est le problème séculaire du développement web: ce qu'il faut faire sur les navigateurs qui ne supportent pas ce que vous avez besoin. À l'heure actuelle, je ne jure que par le recours aux travailleurs sur le Web pour des tâches complexes et de longue durée qui peut être rompu, et pour une raison quelconque, ne peut pas être fait côté serveur. De cette façon, si vous n'avez pas les travailleurs sur le Web, vous attendez simplement plus. Dans le cas contraire, vous auriez à faire un gâchis de votre code avec des enveloppes et autres joyeusetés que vous allez essayer d'éviter plus tard. Ma stratégie de dégradation se produit dès que la page est chargée.

Fonction onload pseudocode:

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

Il vous reste à écrire l'algorithme deux fois, mais vous devez le faire de toute façon si vous voulez soutenir les navigateurs sans travailleurs sur le Web. Donc, cela soulève une question intéressante: il vaut le temps (et d'argent) pour écrire quelque chose deux fois, juste pour que ça peut aller un peu plus vite pour certaines personnes

Autres conseils

Après avoir mâché sur ce pendant quelques jours, je fini par écrire un article sur mon blog:
http://codecube.net/2009/07/cross-platform-javascript -webworker /

L'idée est que dans les cas où WebWorker n'est pas défini, il y a une API wrapper qui utilise simplement des techniques intégrées. Bien que l'échantillon dans l'article est très simple, il fonctionne dans tous les navigateurs: -)

Le projet Bespin a (ce qu'ils appellent) a façade qui leur permet d'exécuter du code JavaScript Web Workers, Gears travailleurs et si ce ne sont pas disponibles dans le thread principal.

Voici ce que John Resig dit répondre à un commentaire sur son blog

  

Je pensais à ce sujet - mais ça va être difficile. Vous devrez rendre votre code traitement utilisation setTimeout / setInterval dès le début (ce code finirait par travailler à la fois travailleur et sur un site web normal). Ainsi, alors que le résultat serait un peu plus lent pour les navigateurs permis travailleurs, au moins, il travaillerait dans les deux cas.

J'ai eu le problème drôle que ma tâche sans le soutien des travailleurs Web était trop lent dans Firefox (script ne répond pas), mais assez vite dans tous les autres navigateurs modernes. Avec les Web Workers, il a travaillé dans tous les navigateurs sauf Opera (10,50) qui ne supporte pas les travailleurs Web du tout, mais Opera a bien fonctionné sans eux.

J'ai donc écrit un WorkerFacade qui utilise l'API de Web Worker lorsqu'ils sont disponibles ou falsifie l'API avec quelques ajouts mineurs au travailleur réelle JS. Vous pouvez trouver WorkerFacade comme essentiel sur GitHub . A bien fonctionné pour moi, pourrait aider quelqu'un d'autre, aussi.

Vous pouvez utiliser Modernizr ( http://modernizr.com/download/#-webworkers ) pour détecter si le navigateur prend en charge webworkers, au cours de laquelle vous pointez doivent alors avoir deux versions ... vous pouvez voir les navigateurs avec 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;
         }
}

De cette façon, vous libérer de l'onload mémoire et vous n'avez pas besoin de demander de l'aide à chaque fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top