Подтвердить что ты не робот

Деградация с веб-рабочими

Итак, я начинаю все больше слышать о Web Workers. Я думаю, что это абсолютно фантастично, но вопрос, который я до сих пор не видел, так это то, как поддерживать старые браузеры, которые еще не поддерживают новую технологию.

Единственное решение, с которым я смог придумать до сих пор, - сделать какую-то оболочку вокруг функциональности веб-исполнителя, которая вернется к некоторому сумасшедшему таймерному решению, которое будет имитировать многопоточное выполнение.

Но даже в этом случае, как определить, являются ли веб-сотрудники поддерживаемой функцией браузера, выполняющего в настоящий момент javascript?

Спасибо!

4b9b3361

Ответ 1

Это старая проблема веб-разработки: что делать с браузерами, которые не поддерживают то, что вам нужно. В настоящее время я выступаю только за использование Web Workers для сложных, долговременных задач, которые могут быть разбиты и по какой-то причине не могут быть выполнены на стороне сервера. Таким образом, если у вас нет веб-работников, вы просто ждете дольше. В противном случае вам нужно будет испортить свой код с помощью оберток и еще чего вы попытаетесь избежать позже. Моя стратегия деградации происходит, как только загружается страница.

псевдокод функции загрузки:

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

Вам все равно придется писать алгоритм дважды, но вам все равно придется это делать, если вы хотите поддерживать браузеры без веб-рабочих. Поэтому возникает интересный вопрос: стоит ли время (и деньги) писать что-то дважды, так что для некоторых людей он может немного ускориться?

Ответ 2

После разжевывания этого в течение нескольких дней я закончил писать статью в своем блоге:
http://codecube.net/2009/07/cross-platform-javascript-webworker/

Идея заключается в том, что в тех случаях, когда WebWorker не определен, существует API-интерфейс обертки, который использует только встроенные методы. Хотя образец в статье очень прост, он работает во всех браузерах: -)

Ответ 3

В проекте Bespin есть (что они называют) facade, который позволяет им запускать код JavaScript в Web Workers, Gears Workers, и если эти недоступны в основном потоке.

Ответ 4

Вот что сказал Джон Ресиг отвечая на комментарий к его блогу

Я подумал об этом, но это будет сложно. Вам нужно будет сделать код обработки с помощью setTimeout/setInterval с самого начала (этот код будет работать как у рабочего, так и на обычном веб-сайте). Таким образом, хотя результат будет несколько медленнее для браузеров с поддержкой рабочих, по крайней мере, он будет работать в обоих случаях.

Ответ 5

У меня была смешная проблема, что моя задача без поддержки веб-рабочего была слишком медленной в Firefox (не отвечает script), но достаточно быстро во всех других современных браузерах. С веб-рабочими он работал во всех браузерах, кроме Opera (10.50), который вообще не поддерживает Web Workers, но Opera отлично работала без них.

Итак, я написал WorkerFacade, который использует API Web Worker, когда он доступен, или подделывает API с некоторыми незначительными дополнениями к реальному JS рабочего. Вы можете найти WorkerFacade как сущность GitHub. Работал хорошо для меня, также мог помочь кому-то еще.

Ответ 6

Вы можете использовать Modernizr (http://modernizr.com/download/#-webworkers), чтобы определить, поддерживает ли браузер веб-мастеров, после чего вам нужно иметь две версии... Вы можете видеть браузеры с веб-работниками в http://caniuse.com/webworkers

if(Modernizr.webworkers) 
{} 
else
{}

Ответ 7

@geowa4

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

Таким образом, вы освобождаете нагрузку на память, и вам не нужно запрашивать поддержку каждый раз.