使用importScripts的web worker中出错(defiant.min.js)

时间:2017-04-24 22:27:21

标签: javascript web-worker

我试图在网络工作者中使用defiant.js,因为除了JSON.search之外我还在进行繁重的计算。 但是我一直在

  

未捕获错误:未捕获的ReferenceError:未定义Defiant

我创建了一个使用部分反义演示代码的简单示例。

有谁知道这是否是defiant.js问题还是我只是导入错误的脚本? 或者是否有另一种解决方案可以做到这一点?

在main.html中的JS

var obj = {
    "car": [
        {"id": 10, "color": "silver", "name": "Volvo"},
        {"id": 11, "color": "red",    "name": "Saab"},
        {"id": 12, "color": "red",    "name": "Peugeot"},
        {"id": 13, "color": "yellow", "name": "Porsche"}
    ],
    "bike": [
        {"id": 20, "color": "black", "name": "Cannondale"},
        {"id": 21, "color": "red",   "name": "Shimano"}
    ]
}
    var worker = new Worker('defiantWW.js');


    worker.addEventListener('message', function(e) {
      console.log( e.data);
    }, false);
    worker.postMessage(obj);

网络工作者文件

self.addEventListener('message', function(e) {
    importScripts('defiant.min.js')
    var obj=e.data;
    var search = JSON.search(obj, '//car[color="yellow"]/name');
  self.postMessage(search);
}, false);

EDIT 根据评论中dandavis的建议更改importScripts()的位置 - 但结果相同

web worker文件v2

importScripts('defiant.min.js')
self.addEventListener('message', function(e) {
    var obj=e.data;
    var search = JSON.search(obj, '//car[color="yellow"]/name');
  self.postMessage(search);
}, false);

2 个答案:

答案 0 :(得分:0)

可悲的是,defiantJS不支持在web-worker中使用。 在问题上得到feedback from Hakan Bilgin

  

Defiant.js

已经支持网络工作者
<script src="defiant.min.js"></script>
<script>

var obj = {
    "car": [
        {"id": 10, "color": "silver", "name": "Volvo"},
        {"id": 11, "color": "red",    "name": "Saab"},
        {"id": 12, "color": "red",    "name": "Peugeot"},
        {"id": 13, "color": "yellow", "name": "Porsche"}
    ],
    "bike": [
        {"id": 20, "color": "black", "name": "Cannondale"},
        {"id": 21, "color": "red",   "name": "Shimano"}
    ]
};

Defiant.getSnapshot(obj, function(snapshot) {
    var found = JSON.search(snapshot, '//car');
    console.log(found);
});

</script>
  

[Snapshot]并不能让我从我自己的网络工作者那里获得挑衅。   我可以在主线程中执行快照,然后将结果发布到我的web-worker,但是大型JSON(5-15mb)仅在web-worker中处理。我必须将它传递给主线程,运行Snapshot(在另一个web-worker中执行),然后将结果传递回我的WW。   由于我经常使用JSON.search会导致主线程上出现大量不必要的开销。

     

否......您无法从Web工作人员中访问Defiant

答案 1 :(得分:0)

你好加载 service worker 试试这个链接:

https://developers.google.com/web/fundamentals/primers/service-workers

正如它所提到的:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/sw.js').then(function(registration) {
      // Registration was successful
      console.log('ServiceWorker registration successful with scope: ', registration.scope);
    }, function(err) {
      // registration failed :(
      console.log('ServiceWorker registration failed: ', err);
    });
  });
}