From b6fb3b314e8b31c180b0605b2cc584b3daef6d40 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Nov 2021 13:51:47 -0500 Subject: [PATCH] reflow catalog.putFile using promises. only notify file listeners when concurrent ops complete --- src/kiri/catalog.js | 35 ++++++++++++++++++++++++++--------- src/kiri/widget.js | 2 +- src/moto/db.js | 37 ++++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/kiri/catalog.js b/src/kiri/catalog.js index 03ad7a58..78c2aa7e 100644 --- a/src/kiri/catalog.js +++ b/src/kiri/catalog.js @@ -14,6 +14,7 @@ this.listeners = []; this.options = options || {}; this.deferredHandler = null; + this.concurrent = 0; this.refresh(); } @@ -82,20 +83,36 @@ * @param {Function} [callback] */ putFile(name, vertices, callback) { + let mark = Date.now(); let store = this; - store.db.put('file-'+name, vertices, function(ok) { - if (ok) { + let pdb = store.db.promise(); + store.concurrent++; + + function ondone(error) { + if (callback) callback(error); + if (--store.concurrent === 0) { + notifyFileListeners(store); + } + } + + pdb.put(`file-${name}`, vertices) + .then(() => { store.files[name] = { - vertices: vertices.length/3, + vertices: vertices.length / 3, updated: new Date().getTime() }; - saveFileList(store); - store.decimate(vertices, function(decimated) { - store.db.put('fdec-'+name, decimated); - if (callback) callback(decimated); + return pdb.put('files', store.files); + }) + .then(() => { + return new Promise((resolve,reject) => { + store.decimate(vertices, resolve); }); - } else if (callback) callback(ok); - }); + }) + .then(decimated => { + return pdb.put(`fdec-${name}`, decimated) + }) + .then(ondone) + .catch(ondone); }; rename(name, newname, callback) { diff --git a/src/kiri/widget.js b/src/kiri/widget.js index 9b2f0fbb..35e4d3c5 100644 --- a/src/kiri/widget.js +++ b/src/kiri/widget.js @@ -268,7 +268,7 @@ console.log/** Copyright Stewart Allen -- All Rights Reserved */ this._save_timer = setTimeout(() => { this._save_timer = undefined; this.saveState(() => {}); - }, 150); + }, 1500); return; } let widget = this; diff --git a/src/moto/db.js b/src/moto/db.js index e44853d7..bad39de1 100644 --- a/src/moto/db.js +++ b/src/moto/db.js @@ -54,27 +54,30 @@ return this; }; - SP.promise = { - keys: (lower, upper) => new Promise(function(resolve, reject) { - this.keys(resolve,lower,upper); - }), + SP.promise = function() { + let db = this; + return { + keys: (lower, upper) => new Promise(function(resolve, reject) { + db.keys(resolve,lower,upper); + }), - iterate: (lower, upper, nullterm) => new Promise(function(resolve, reject) { - this.iterate(resolve, lower, upper, nullterm); - }), + iterate: (lower, upper, nullterm) => new Promise(function(resolve, reject) { + db.iterate(resolve, lower, upper, nullterm); + }), - get: (key) => new Promise(function(resolve, reject) { - this.get(key, resolve); - }), + get: (key) => new Promise(function(resolve, reject) { + db.get(key, resolve); + }), - put: (key, value) => new Promise(function(resolve, reject) { - this.put(key, value, resolve); - }), + put: (key, value) => new Promise(function(resolve, reject) { + db.put(key, value, resolve); + }), - remove: (key) => new Promise(function(resolve, reject) { - this.remove(key, resolve); - }) - }; + remove: (key) => new Promise(function(resolve, reject) { + db.remove(key, resolve); + }) + }; + } SP.keys = function(callback, lower, upper) { let out = [];