Деградация с веб-рабочими
Итак, я начинаю все больше слышать о Web Workers. Я думаю, что это абсолютно фантастично, но вопрос, который я до сих пор не видел, так это то, как поддерживать старые браузеры, которые еще не поддерживают новую технологию.
Единственное решение, с которым я смог придумать до сих пор, - сделать какую-то оболочку вокруг функциональности веб-исполнителя, которая вернется к некоторому сумасшедшему таймерному решению, которое будет имитировать многопоточное выполнение.
Но даже в этом случае, как определить, являются ли веб-сотрудники поддерживаемой функцией браузера, выполняющего в настоящий момент javascript?
Спасибо!
Ответы
Ответ 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;
}
}
Таким образом, вы освобождаете нагрузку на память, и вам не нужно запрашивать поддержку каждый раз.