17

だから私はWebワーカーを作成しています:

var arrayit = function(obj) {
  return Array.prototype.slice.call(obj);
};
work = arrayit(images);
console.log(work);
//work = images.push.apply( images, array );
// Method : "load+scroll"
var worker = new Worker('jail_worker.js');
worker.postMessage(work)
worker.onmessage = function(event) {
  console.log("Worker said:" + event.data);
};

画像は次のとおりです。

$.jail.initialStack = this;
// Store the selector into 'triggerEl' data for the images selected
this.data('triggerEl', (options.selector) ? $(options.selector) : $window);
var images = this;

私の問題はこれと関係があると思います:

http://dev.w3.org/html5/spec/Overview.html#safe-passing-of-structured-data

どうすればこれを回避できますか?ご覧のとおり、ホストオブジェクトを実際の配列にスライスしようとしましたが、うまくいきませんでした。

これが私がハッキングしているファイルへのリンクです:

https://github.com/jtmkrueger/JAIL

アップデート - - - - - - - - - - - - - - - - - - - - - - - - - -

これは、@davinから受け入れられた回答に基づいて私がしなければならなかったことです。

var arrayit = function(obj) {
  return Array.prototype.slice.call(obj);
};
imgArray = arrayit(images);
work = _.map(images, function(i){ return i.attributes[0].ownerElement.outerHTML; });

var worker = new Worker('jail_worker.js');
worker.postMessage(work)
worker.onmessage = function(event) {
  console.log("Worker said:" + event.data);
};

注:互換性を確保するためにunderscore.jsを使用しました。

4

2 に答える 2

22

ホストオブジェクトをWebワーカー(おそらくdom要素)に渡そうとしたため、元の例外がスローされた可能性があります。それ以降の試行では、同じエラーはスローされません。2つの重要なポイントを覚えておいてください。異なるスレッド間で共有メモリがないことと、WebワーカーがDOMを操作できないことです。

postMessage構造化データのスレッドへの受け渡しをサポートし、データを内部でシリアル化します(または他の方法でデータの値を再帰的にコピーします)。DOM要素をシリアル化すると循環参照エラーが発生することが多いため、mapシリアル化するオブジェクトを選択し、関連データを抽出してWebワーカーで再構築することをお勧めします。

于 2011-09-21T23:17:41.797 に答える
0

Uncaught DataCloneError: An object could not be clonedオブジェクトのキーとしてindexeddb関数に保存しようとしたときに再現されました。保存されたオブジェクトがシリアル化可能であることを再確認する必要があります

于 2014-04-03T14:13:07.027 に答える