我试图在网络工作者中使用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);
答案 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);
});
});
}