reflow catalog.putFile using promises. only notify file listeners when concurrent ops complete

This commit is contained in:
Stewart Allen 2021-11-18 13:51:47 -05:00
commit b6fb3b314e
3 changed files with 51 additions and 31 deletions

View file

@ -14,6 +14,7 @@
this.listeners = []; this.listeners = [];
this.options = options || {}; this.options = options || {};
this.deferredHandler = null; this.deferredHandler = null;
this.concurrent = 0;
this.refresh(); this.refresh();
} }
@ -82,20 +83,36 @@
* @param {Function} [callback] * @param {Function} [callback]
*/ */
putFile(name, vertices, callback) { putFile(name, vertices, callback) {
let mark = Date.now();
let store = this; let store = this;
store.db.put('file-'+name, vertices, function(ok) { let pdb = store.db.promise();
if (ok) { store.concurrent++;
function ondone(error) {
if (callback) callback(error);
if (--store.concurrent === 0) {
notifyFileListeners(store);
}
}
pdb.put(`file-${name}`, vertices)
.then(() => {
store.files[name] = { store.files[name] = {
vertices: vertices.length/3, vertices: vertices.length / 3,
updated: new Date().getTime() updated: new Date().getTime()
}; };
saveFileList(store); return pdb.put('files', store.files);
store.decimate(vertices, function(decimated) { })
store.db.put('fdec-'+name, decimated); .then(() => {
if (callback) callback(decimated); 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) { rename(name, newname, callback) {

View file

@ -268,7 +268,7 @@ console.log/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
this._save_timer = setTimeout(() => { this._save_timer = setTimeout(() => {
this._save_timer = undefined; this._save_timer = undefined;
this.saveState(() => {}); this.saveState(() => {});
}, 150); }, 1500);
return; return;
} }
let widget = this; let widget = this;

View file

@ -54,27 +54,30 @@
return this; return this;
}; };
SP.promise = { SP.promise = function() {
let db = this;
return {
keys: (lower, upper) => new Promise(function(resolve, reject) { keys: (lower, upper) => new Promise(function(resolve, reject) {
this.keys(resolve,lower,upper); db.keys(resolve,lower,upper);
}), }),
iterate: (lower, upper, nullterm) => new Promise(function(resolve, reject) { iterate: (lower, upper, nullterm) => new Promise(function(resolve, reject) {
this.iterate(resolve, lower, upper, nullterm); db.iterate(resolve, lower, upper, nullterm);
}), }),
get: (key) => new Promise(function(resolve, reject) { get: (key) => new Promise(function(resolve, reject) {
this.get(key, resolve); db.get(key, resolve);
}), }),
put: (key, value) => new Promise(function(resolve, reject) { put: (key, value) => new Promise(function(resolve, reject) {
this.put(key, value, resolve); db.put(key, value, resolve);
}), }),
remove: (key) => new Promise(function(resolve, reject) { remove: (key) => new Promise(function(resolve, reject) {
this.remove(key, resolve); db.remove(key, resolve);
}) })
}; };
}
SP.keys = function(callback, lower, upper) { SP.keys = function(callback, lower, upper) {
let out = []; let out = [];