javascript - Chrome 与 webworkers 和 createImageBitmap 崩溃

标签 javascript google-chrome crash web-worker

我目前在使用网络 worker 加载图像时遇到问题。我想批量加载一堆图像,然后对这些图像进行一些处理(在我的例子中,使用 createImageBitmap 将源图像转换为 ImageBitmap)。目前用户可以取消请求。如果工作线程尚未完成,则在尝试终止该工作线程时,这会导致崩溃。我在这里创建了一个 fiddle https://jsfiddle.net/e4wcro0o/18/持续崩溃。

问题出在这里:

function closeWorker() {
   if (!isClosed) {
    console.log("terminating worker");
    isClosed = true;
    worker.terminate();
  }
}

for (let i = 0; i < srcImages.length; i++) {
    loadImageWithWorker(new URL(srcImages[i], window.location).toString()).then(function(img) {
    closeWorker();
    console.log(img);
  });
}

在第一个已解决的 Promise 上调用 closeWorker() 可能看起来有点奇怪,但这是否意味着崩溃是可重现的。我只在 chrome 上使用 64.0.3282.186(官方版本)(64 位)

进行了测试

关于我做错了什么有什么想法吗?

最佳答案

我也遇到过同样的问题。我认为原因是在 createImageBitmap 函数期间终止工作线程。

我已经修改了您的 JSFiddle,采用了尽早终止工作线程以避免崩溃的方法。

const worker = createWorker(() => {

    const pendingBitmaps = {};
    var pendingKill = false;

    self.addEventListener("message", e => {

        const src = e.data;

        if (src == "KILL") {
            pendingKill = true;
            Promise.all(Object.values(pendingBitmaps)).then(_ => self.postMessage("READY"));
        }

        // not accepting anymore conversions
        if (pendingKill) {
            self.postMessage({src, bitmap: null});
            return;
        }

        pendingBitmaps[src] = fetch(src).then(response => response.blob())
            .then(blob => {
                if (pendingKill) return null;
                return createImageBitmap(blob);
            })
            .then(bitmap => {
                self.postMessage({src,bitmap});
                delete pendingBitmaps[src];
            })
    })
});

https://jsfiddle.net/wrf1sLbx/16/

关于javascript - Chrome 与 webworkers 和 createImageBitmap 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49363047/

相关文章:

javascript - Chrome 上的 Angular 加载空白屏幕,控制台中没有错误

xcode4 - 使用Xcode 4.2为iOS 3.1.3编译

javascript - slack files.upload - 如何从 javascript/jQuery 将文件作为有效负载发送

java - Google Chrome 插件无法与 Chrome 配合使用

javascript - html element.style.color 问题

google-chrome - 调用Google的 "match patterns"API?

ios - 崩溃报告.. 任何线索在哪里寻找?

使用 Go 例程和变量时的 Go 插件核心转储

javascript - 在不同的框架中设置内容

javascript - 在socket.io 1.4.5中获取连接的IP