浏览代码

Улучшение прогрессбара загрузки/сохранения книги

Book Pauk 6 年之前
父节点
当前提交
7f90c09227
共有 2 个文件被更改,包括 44 次插入4 次删除
  1. 43 4
      client/components/Reader/share/bookManager.js
  2. 1 0
      client/components/Reader/versionHistory.js

+ 43 - 4
client/components/Reader/share/bookManager.js

@@ -143,6 +143,34 @@ class BookManager {
         }
     }
 
+
+    async deflateWithProgress(data, callback) {
+        const chunkSize = 16384;
+        const deflator = new utils.pako.Deflate({level: 9});
+
+        let chunkTotal = 1 + Math.floor(data.length/chunkSize);
+        let chunkNum = 0;
+
+        for (var i = 0; i < data.length; i += chunkSize) {
+            if ((i + chunkSize) >= data.length) {
+                deflator.push(data.substring(i, i + chunkSize), true);
+            } else {
+                deflator.push(data.substring(i, i + chunkSize), false);
+            }
+            chunkNum++;
+            callback(Math.round(chunkNum/chunkTotal*100));
+            await utils.sleep(1);
+        }
+
+        if (deflator.err) {
+            throw new Error(deflator.msg);
+        }
+        
+        callback(100);
+
+        return deflator.result;
+    }
+
     async addBook(newBook, callback) {
         if (!this.books) 
             await this.init();
@@ -151,7 +179,12 @@ class BookManager {
         meta.addTime = Date.now();
 
         const cb = (perc) => {
-            const p = Math.round(80*perc/100);
+            const p = Math.round(30*perc/100);
+            callback(p);
+        };
+
+        const cb2 = (perc) => {
+            const p = Math.round(30 + 65*perc/100);
             callback(p);
         };
 
@@ -160,10 +193,11 @@ class BookManager {
 
         let data = newBook.data;
         if (result.dataCompressed) {
-            data = utils.pako.deflate(data, {level: 9});
+            //data = utils.pako.deflate(data, {level: 9});
+            data = await this.deflateWithProgress(data, cb2);
             result.dataCompressedLength = data.byteLength;
         }
-        callback(90);
+        callback(95);
 
         this.books[meta.key] = result;
         this.booksCached[meta.key] = this.metaOnly(result);
@@ -202,7 +236,12 @@ class BookManager {
             await utils.sleep(10);
 
             if (result.dataCompressed) {
-                data = utils.pako.inflate(data, {to: 'string'});
+                try {
+                    data = utils.pako.inflate(data, {to: 'string'});
+                } catch (e) {
+                    this.delBook(meta);
+                    throw e;
+                }
             }
             callback(20);
 

+ 1 - 0
client/components/Reader/versionHistory.js

@@ -7,6 +7,7 @@ export const versionHistory = [
 <ul>
     <li>исправлен баг - падение сервера при распаковке битых архивов книг</li>
     <li>исправлен баг - не распознавались некоторые книги формата fb2 в кодировке utf8</li>
+    <li>незначительные улучшения прогрессбаров</li>
 </ul>
 `
 },