Так у меня есть этот JS IndexedDB библиотека:IndexedDB одна библиотека вызывается из нескольких различных мест с различными обратными вызовами
window.db = {
name:"indexedDBname",
varsion:0.7,
_settings:"indexedDBobject",
h:null, // Handler to the db
open:function(callback,callback1) {
var r = indexedDB.open(db.name);
r.onupgradeneeded = function(e){ console.log(".onupgradeneeded is not yet supported by webkit"); };
r.onsuccess = function(e){
db.h = e.target.result;
if(db.version !== db.h.version) {
var v = db.h.setVersion(db.version);
v.onsuccess = function(e) {
if(db.h.objectStoreNames.contains(db._settings)) db.h.deleteObjectStore(db._settings);
db.h.createObjectStore(db._settings, { keyPath:"name" });
};
v.onfailure = db.onerror;
v.onerror = db.onerror;
v.onblocked = db.onerror;
}
// CALLBACKS
if(typeof callback=="function" && typeof callback1=="function") callback.call(window,callback1);
else if(typeof callback=="function" && typeof callback1!="function") callback.call(window);
};
r.onfailure = db.onerror;
},
getSettings:function(callback){ // retrieve user custom settings
var t = db.h.transaction([db._settings], IDBTransaction.READ_ONLY),
s = t.objectStore(db._settings),
keyRange = IDBKeyRange.lowerBound(0),
cursorRequest = s.openCursor(keyRange),
tmp = {};
cursorRequest.onsuccess = function(e) {
var result = e.target.result;
if(!!result==false) {
// CALLBACKS
if(typeof callback=="function") callback.call(window);
return;
}
tmp[result.value.name] = result.value.value;
result.continue();
}
cursorRequest.onerror = db.onerror;
},
onerror:function(e){ console.log("Handle and print error here:"+e); }
};
// actual run
db.open(db.getSettings, user.applySettings);
Что я предпочитаю использовать довольно часто, но, как вы можете видеть, те обратный вызов не выглядит слишком ну ... И когда я хочу выполнять серию заданий или даже вызывать любую из этих функций с набором своих параметров, мой код начинает выглядеть действительно изменчивым, например. db.open('forWhichUser',newSettingsToApplyObject, callback1, argumentForCallback1, secondOptionalArgument, callback2, etc);
Так что в старые времена я просто сделать:
db.open('userName', settingsMap);
var opts = db.getSettings();
user.downloadInfoBasedOn(opts);
user.renderInfoTo('userDataHolderId');
но теперь, так как все может начать/закончить в непредсказуемые моменты времени (в зависимости от производительности компьютера, размера БД, и т.д., и т.д .. .) Как я могу обрабатывать все эти асинхронности, сохраняя код изящным и удобочитаемым?
Отлично! Именно то, что я искал! Я рад дать вам ваши первые 25 баллов;) – meeDamian