0

だから私はこのJSindexedDBライブラリを持っています:

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');

しかし今では、すべてが予測できない瞬間に開始/終了する可能性があるため(コンピューターのパフォーマンス、データベースのサイズなどに応じて...)、コードを優雅で読みやすく保ちながら、その非同期性をすべて処理するにはどうすればよいですか?

4

1 に答える 1

2

JavaScriptのpromises/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の遅延オブジェクトを使用してそれを実現できます(http://api.jquery.com/category/deferred-object/)

もう1つのオプションは、IndexedDB APIをラップしてはるかに簡単な方法で公開するstory.jsを使用することです(http://blogs.microsoft.co.il/blogs/gilf/archive/2012/04/21/the-story- begin.aspx)

この回答がお役に立てば幸いです。

ギル

于 2012-05-08T07:11:15.933 に答える