IndexedDB addRecord具有多个JavaScript工作线程

时间:2017-11-08 08:42:03

标签: javascript multithreading indexeddb web-worker dexie

假设我有这一系列文件

20,21,22,23,24,...,35

我通过以下代码段将该系列分成了一些包:

for (var i = 0; i < _Thread_SerieLength; i++) {
    if (data_Seriepack.instanceList[index] !== undefined) {
        bachPack.push(data_Seriepack.instanceList[index]);
        index = index + threadSerieCount;
    }
}

所以pack1为20,24,28,32,p2 = 21,25,29,33,p3 = 22,26,30,34,p4 = 23,27,31,35

在另一方面,我有一个名为js的{​​{1}}文件作为工作线程 BlobDownloader将下载包Urls并将其插入BlobDownloader.js,因此工作线程的代码为:

indexedDb

并且调用该工作人员:

self.onmessage = function (event) {
    var dbObject = new ClientDataBase(event.data.dbName);
    if (event.data != undefined) {
        var Urls = event.data.pack;
        Urls.forEach(function (url, index, arr) {
            var xhr = new XMLHttpRequest(),
                    blob;
            xhr.open("GET", url.imageId, false);
            xhr.responseType = "arraybuffer";
            xhr.addEventListener("load", function () {
                if (xhr.status === 200) {
                    blob = xhr.response;
                    console.log("Befor added to DB:" + url.imageId);
                    dbObject.addRecord(url.imageId, url.imageIndex, event.data.serieUID, blob, blob.byteLength, "").then(function (e) {
                        console.log("After added to DB:" + e);
                        postMessage(e);
                        if (index == arr.length - 1) {
                            self.close();
                        }
                    });
                }

            }, false);
            xhr.send();
        });
    }
}

所以4个线程将由 for (var j = 0; j < self.maxThreadNumber; j++) { bachPack = []; ...... self.customThreadDownloader[j] = new Worker('../Scripts/Metric/Downloader/BlobDownloader.js'); var content = { pack: bachPack, dbName: dataBaseObject[self.Study.studyIndex].dbName, dbVersion: dataBaseObject[self.Study.studyIndex].dbVersion, serieUID: self.Tbox.id, threadIndex: j } self.customThreadDownloader[j].postMessage(content); self.customThreadDownloader[j].onmessage = function (evt) { counterpack++; var dataIndex = self.Urls.indexOf(evt.data); console.log("> Added To DB: " + dataIndex); } .... } 循环并行运行 所以我期望的输出是:

for

但它有点不同:

21,22,23,24,25,26,27...35 =(p2,p4,p3,p1)

21,25,29,33,23,27,31,35,22,26,30,34,... =(P1,P3,P2,P4)

这意味着一个线程运行直到完成,然后另一个线程运行结束,当我使用IndexedDB时似乎没有并行运行。

所以当我删除它时:

20,24,28,32,22,26,30,34,21,25,29,33,23,27,31,35

或在dbObject.addRecord(url.imageId, url.imageIndex, event.data.serieUID, blob, blob.byteLength, "").then(function (e) { console.log("After added to DB:" + e); // postMessage(e); if (index == arr.length - 1) { self.close(); } }); 之后调用postMessage(e);一切正常。

在工作线程中使用IndexedDb有问题吗?

或者有办法实现这种情况吗?

提前致谢。

0 个答案:

没有答案