Javascript Chrome与webworkers和createImageBitmap一起崩溃

Javascript Chrome与webworkers和createImageBitmap一起崩溃,javascript,google-chrome,crash,web-worker,Javascript,Google Chrome,Crash,Web Worker,我当前在使用webworkers加载图像时遇到问题。我想批量加载一组图像,然后对这些图像进行一些处理(在我的例子中,使用createImageBitmap将源图像转换为ImageBitmap)。当前,用户可以取消请求。如果工作进程尚未完成,则在尝试终止工作进程时会导致崩溃。我在这里创建了一个持续崩溃的小提琴 问题在于: function closeWorker() { if (!isClosed) { console.log("terminating worker"); i

我当前在使用webworkers加载图像时遇到问题。我想批量加载一组图像,然后对这些图像进行一些处理(在我的例子中,使用
createImageBitmap
将源图像转换为
ImageBitmap
)。当前,用户可以取消请求。如果工作进程尚未完成,则在尝试终止工作进程时会导致崩溃。我在这里创建了一个持续崩溃的小提琴

问题在于:

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);
  });
}
函数closeWorker(){
如果(!isClosed){
控制台日志(“终止工作程序”);
isClosed=true;
worker.terminate();
}
}
for(设i=0;i
在第一个解决的承诺中调用
closeWorker()
,这看起来有点奇怪,但这是否意味着崩溃是可重现的。我只在chrome上测试了
64.0.3282.186(官方版本)(64位)


你知道我做错了什么吗

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

我已经修改了您的JSFIDLE,使用了一种尽早终止工作者的方法,以避免崩溃

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];
            })
    })
});

加载带有Worker的图像
您知道不会等待,并加载23个大小为7360 x 4912像素的图像,。。浏览器崩溃并不奇怪。如果您让您的员工一次处理一张图像,可能会更好。@Keith感谢您的回复。图像在正常工作流程下加载良好(删除closeWorker()并亲自查看)。问题在于,当试图安全终止工作人员时,我仍然认为加载3 Gig图像并不理想。我认为您的问题很可能是因为在调用closeworker时,可能还有22个异步操作等待处理。我怀疑在这种模式下突然终止一个工作进程是否理想。@Keith,我们不要被图像的大小所困扰,因为即使只加载4个图像,这仍然会崩溃,但我确实同意,问题似乎是在仍有网络请求挂起时终止一个工作进程。