我有一个应用程序在单击按钮后调用网络工作者。计算被移到工作人员以减轻 UI 并使其在计算时响应用户操作。
一切正常,大约 0.8-1.5 秒后,工作人员发送响应。在worker.onmessage
我执行了所有需要的 DOM 操作之后,这个垃圾收集器出现并且实际上阻塞了 UI 2 秒或更长时间,具体取决于 CPU。这真的让我很困惑,因为 UI 阻塞是我想要阻止的。
这是时间线/内存控制台选项卡的屏幕截图:
如您所见,垃圾收集器事件发生在所有 DOM 操作之后。实际上只有一个重绘事件(DocumentFragment
使用)。
主要js代码:
var sortWorker = new Worker('js/contactsorter.js');
sortWorker.onmessage = function(e) {
var messages = [];
e.data.forEach(function(userDoc) {
var contactSection = _drawContact(userDoc);
messages.push(contactSection);
});
meta.append(messages); // this actually appends document fragment as a child
};
sortWorker.postMessage(postMessageData);
contactsorter.js(工人):
onmessage = function(e) {
var uid, output = [], usersStat = {};
// calculations...
postMessage(output);
close();
};
有没有办法避免在这个地方发生这些垃圾收集器事件?
UPD:在我看来,垃圾收集器事件的时间取决于发送给工作人员的数据量。
UPD2:关闭和启动垃圾收集器事件后仅发生两次,因此阻塞 UI 不到一秒钟。嗯?