javascript - IndexedDB 一个库从多个不同的地方使用不同的回调调用

标签 javascript asynchronous callback chaining

所以我有这个 JS 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,等等);

所以在过去我会这样做:

db.open('userName', settingsMap);
var opts = db.getSettings();
user.downloadInfoBasedOn( opts );
user.renderInfoTo('userDataHolderId');

但是现在,由于一切都可以在不可预测的时刻开始/完成(取决于计算机性能、数据库大小等),我如何处理所有这些异步性,保持代码优雅和可读?

最佳答案

您可以使用 JavaScript Promise/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/)

另一个选择是使用story.js,它包装了IndexedDB API并以更简单的方式公开它(http://blogs.microsoft.co.il/blogs/gilf/archive/2012/04/21/the -故事开始.aspx)

希望这个答案对您有所帮助。

吉尔

关于javascript - IndexedDB 一个库从多个不同的地方使用不同的回调调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410230/

相关文章:

JavaScript 转换用户输入

javascript - 如何获取 d3 配对条形图上条形的 x 位置以进行工具提示更新

javascript - 两个数组的串联

python - 如何在 Twisted/Python 中使用 AMP 创建双向消息传递

javascript - 如何从异步调用返回响应?

javascript - node.js mongojs findOne 回调返回错误为空

javascript - 如何在新的 AngularFire v0.8.0 中实现 $child 方法?

c# - 异步聊天服务器缓冲区问题

node.js - 如何使用回调等待两个查询异步 Node

javascript - '' function({})(req, res )'' 等内容的最后一个括号在 JavaScript 中意味着什么?