2012-05-02 1 views
0

Так у меня есть этот 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'); 

но теперь, так как все может начать/закончить в непредсказуемые моменты времени (в зависимости от производительности компьютера, размера БД, и т.д., и т.д .. .) Как я могу обрабатывать все эти асинхронности, сохраняя код изящным и удобочитаемым?

ответ

2

Вы можете использовать обещание JavaScript/deferreds картины:

  1. http://wiki.commonjs.org/wiki/Promises/A
  2. http://blogs.msdn.com/b/ie/archive/2011/09/11/asynchronous-programming-in-javascript-with-promises.aspx

Promises/deferreds может помочь вам создать гораздо проще и читаемый код асинхронного. Вы можете использовать объект jQuery deffered для достижения этого (http://api.jquery.com/category/deferred-object/)

Другой вариант - использовать story.js, которые обертывают API IndexedDB и предоставляют его в значительной степени более простой способ (http://blogs.microsoft.co.il/blogs/gilf/archive/2012/04/21/the-story-begins.aspx)

Надеюсь, вы найдете этот ответ полезным.

Gil

+0

Отлично! Именно то, что я искал! Я рад дать вам ваши первые 25 баллов;) – meeDamian