2017-02-17 39 views
0

メインスレッドから(作業コピー)を私のワーカーにどのように送ることができますか?Webworkerへの投稿機能

私が試したときに:worker.postMessage({data, func: (data) => data)、firefoxはエラーメッセージを表示します:DataCloneError:オブジェクトをクローンできませんでした。クロムとして

、メッセージは異なるが、それでもエラーが発生する:キャッチされないのDOMException:オブジェクトをクローン化することができませんでした:「労働者に「のpostMessage」を実行できませんでした。

答えて

1

まだこれをテストし、仕様から、労働者に送信することができる唯一のオブジェクトは、「譲渡」オブジェクトであることを思わない: https://developer.mozilla.org/en-US/docs/Web/API/Transferable

私は最初の1過程で、いくつかの例を見つけました私は彼がkindまたはURLエンコードを使用していると推測しています。オブジェクトの場合は、2番目の例のようにJSONに変換できます。

How to pass functions to JavaScript Web Worker

Passing objects to a web worker

私は、

+0

任意の関数を投稿できるようにするには、匿名のは、私は[のtoString]を呼び出すために必要な、付属(https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Function/toString)をクリックし、[eval](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#eval_as_a_string_defining_function_requires_(_and_)_as_prefix_and_suffix)it労働者の内部から。 – Wanderson

0

はい、それは可能..です私は、そのテストされているもので最新の状態に保つことができ、あまりにも数日でこれを行う必要があります私はそれをとし、jsファイルを持たないWebワーカーを作成することができます.JavaScriptコードで生成されたBlobファイルを使用するだけです。

setInterval(()=>{console.log("non bloked " + Math.random())}, 900) 
 

 
console.log("starting blocking code in Worker") 
 
console.time("blocked") 
 

 
genericWorker(window, ["blockCpu", function (block){  
 
    block(10000) //This blockCpu function is defined below 
 
    return `\n\nbla ${123123*2312} bla \n` //This is catched in the resolved promise 
 

 
}]).then(function (result){ 
 
    console.timeEnd("blocked") 
 
    console.log("End of blocking code", result) 
 
}) 
 
.catch(function(error) { console.log(error) }) 
 

 

 
/* A Web Worker that does not use a File, it create that from a Blob 
 
    @cb_context, The context where the callback functions arguments are, ex: window 
 
    @cb, ["fn_name1", "fn_name2", function (fn1, fn2) {}] 
 
     The callback will be executed, and you can pass other functions to that cb 
 
*/ 
 
function genericWorker(cb_context, cb) { 
 
    return new Promise(function (resolve, reject) { 
 

 
     if (!cb || !Array.isArray(cb)) 
 
      return reject("Invalid data") 
 

 
     var callback = cb.pop() 
 
     var functions = cb 
 

 
     if (typeof callback != "function" || functions.some((fn)=>{return typeof cb_context[fn] != "function"})) 
 
      return reject(`The callback or some of the parameters: (${functions.toString()}) are not functions`) 
 

 
     if (functions.length>0 && !cb_context) 
 
      return reject("context is undefined") 
 

 
     callback = fn_string(callback) //Callback to be executed 
 
     functions = functions.map((fn_name)=> { return fn_string(cb_context[fn_name]) }) 
 

 
     var worker_file = window.URL.createObjectURL(new Blob(["self.addEventListener('message', function(e) { var bb = {}; var args = []; for (fn of e.data.functions) { bb[fn.name] = new Function(fn.args, fn.body); args.push(fn.name)}; var callback = new Function(e.data.callback.args, e.data.callback.body); args = args.map(function(fn_name) { return bb[fn_name] }); var result = callback.apply(null, args) ;self.postMessage(result);}, false)"])) 
 
     var worker = new Worker(worker_file) 
 

 
     worker.postMessage({ callback: callback, functions: functions }) 
 

 
     worker.addEventListener('error', function(error){ return reject(error.message) }) 
 

 
     worker.addEventListener('message', function(e) { 
 
      resolve(e.data), worker.terminate() 
 
     }, false) 
 

 
     //From function to string, with its name, arguments and its body 
 
     function fn_string (fn) { 
 
      var name = fn.name, fn = fn.toString() 
 

 
      return { name: name, 
 
       args: fn.substring(fn.indexOf("(") + 1, fn.indexOf(")")), 
 
       body: fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}")) 
 
      } 
 
     } 
 
    }) 
 
} 
 

 
//random blocking function 
 
function blockCpu(ms) { 
 
    var now = new Date().getTime(); 
 
    var result = 0 
 
    while(true) { 
 
     result += Math.random() * Math.random(); 
 
     if (new Date().getTime() > now +ms) 
 
      return; 
 
    } 
 
}