reede, 25. september 2009

Web Workers API

Firefox 3.5, Safari 4 ja Chrome 2 toetavad uut JavaScript API't nimega Web Workers. Põhimõtteliselt peaks Internet Exploreris ning eelpoolmainitud brauserite vanemates versioonides saavutama sama tulemuse Google Gears WorkerPool API, kuid ebamugavaks teeb asja, et sellisel juhul tuleks kasutaja arvutisse paigaldada Google Gears.

Iphones kahjuks momendil Web Workers toetatud pole (kuigi arvata on, et see sinna kunagi jõuab, kuna Safari 4's on toetus juba olemas), seega Web Worker API't eelmises postituses mainitud veebiaplikatsioonides lisavahendina kasutada ei saa.

Web Workers on rakendusliides, mis võimaldab lükata suuremad arvutuskäigud jms. JavaScript programmi põhivoost eraldi protsessi, nii et see ei segaks programmi põhivoo kulgu (erinevad pikemad tsüklid ja arvutused võivad muidu panna brauseri "hanguma").

Kasutamine on lihtne - worker asub eraldi .js failis, see laetakse läbi Worker konstruktori käima ning suhtlus põhiprogrammi ja workeri vahel käib üksteisele teateid postitades.

Näiteks võib põhiprogramm välja näha nii:

var worker = new Worker("worker.js");
worker.onmessage = function(e){
  document.getElementByid('result').innerHTML = e.data;
};
worker.postMessage("start");

Kõigepealt defineeritakse uus worker, mis asub failis worker.js. Seejärel defineeritakse sõnumi vastuvõtmise sündmus, mis ei kirjutab sõnumi sisu lehele kindla elemendi sisutekstiks. Ja viimasena saadetakse välja sõnum, mille alusel worker teab tööd alustada.

Worker.js fail võiks sellisel juhul välja näha järgmine:

onmessage = function(e){
  if ( e.data === "start" ) {
    var tulemus = 0;
    /
     * tee siin midagi
     */
    postMessage(tulemus);
  }
};

Esiteks defineerime sõnumi vastuvõtmise sündmuse (nb, tasub tähele panna, et erinevalt põhiprogrammist, asub onmessage globaalses, st. window skoobis, samuti ka postMessage).

Kontrollime, kas on õige sisuga sõnum, arvutame midagi ning tagastame tulemuse põhiprogrammile, kutsudes välja postMessage funktsiooni. Saadetud sõnum käivitabki põhiprogrammis sündmuse worker.onmessage.

Piirangud

Web Workers API seab kahjuks ka mõned piirangud. Näiteks ei ole võimalik workeril pääseda ligi DOM objektile. Küll aga on saab teha serverile Ajax päringuid, kasutada taimereid jms.

Saadetavad sõnumid peaksid olema string väärtustena, näiteks JSON või XML tekstina või mõne muu primitiivse väärtusena (number, boolean). Objekte kahjuks saata ei saa, kuna tulemus pole ette teada (erinevad brauserid võivad käituda erinevalt).

Demo

Töötava demorakendusena saab uurida aadressi http://jscode.org/worker/- selles olev programm arvutab taustal välja algarvud kuni numbrini 10 000 ning kuvab tulemused lehel.

Kommentaare ei ole: