Webworker

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Javascript</language>
<run id="5aa45bbd790s9">
function InlineWorker(func, self) {
  var _this = this;
  var functionBody;
  var ticket = 0; 
  self = self || {};

  functionBody = func.toString().trim().match(
    /^function\s*\w*\s*\([\w\s,]*\)\s*{([\w\W]*?)}$/
  )[1];
    
  return new Worker(URL.createObjectURL(
    new Blob([ functionBody ], { type: "text/javascript" })
  ));

  function postMessage(data) {
    setTimeout(function() {
      _this.onmessage({ data: data });
    }, 0);
  }

  this.self = self;
  this.self.postMessage = postMessage;

  setTimeout(func.bind(self, self), 0);
}

InlineWorker.prototype.postMessage = function postMessage(data) {
  var _this = this;
  setTimeout(function() {
    _this.self.onmessage({ data: data });
  }, 0);
};

var JSONParseWorker = new InlineWorker(function(self) {
  self.onmessage = function(e) {
    var data = e.data;
    var json = JSON.parse( data );
    postMessage(json);
  };
});

JSONParseWorker.onmessage = function(e) {
  if(JSONParseWorker.callbacks[e.data.id]){
    JSONParseWorker.callbacks[e.data.id](e.data.data);
    delete JSONParseWorker.callbacks[e.data.id];
  }
};
JSONParseWorker.callbacks = [];
JSONParseWorker.parse = function(json, callback){
  function uuidv4() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
      var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  }

  var id = uuidv4();
  JSONParseWorker.callbacks[id] = callback;
  JSONParseWorker.postMessage('{"id":"'+id+'", "data":'+json+'}');
};

JSONParseWorker.parse('{"name":"test"}',function(e){alert(e);})
</run>