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.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) {

View file

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

View file

@ -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 = [];