javascript - IndexedDb 的延迟 then of then 是未定义的

标签 javascript jquery indexeddb jquery-deferred canjs

我正在使用 CanJs 并且正在学习 jquery deferred 但我遇到了问题。 我创建了一个 Controller 作为 Singleton 来管理 IndexedDb 中的数据。

首先,我创建了一个 openDb 函数,如下所示:

openDbDeferred: null,

    openDb: function (dbName, dbVersion) {
        console.log('Open DB...');

        var openDbDeferred = this.openDbDeferred;

        if (!openDbDeferred || openDbDeferred.isRejected()) {
            openDbDeferred = $.Deferred();

            var db;
            var req = indexedDB.open(dbName, dbVersion);

            req.onsuccess = function (evt) {
                db = this.result;
                console.log('openDB SUCCESS');
                openDbDeferred.resolve(db);
            };

            req.onerror = function (evt) {
                console.error("[ERROR] openDb: " + evt);
                openDbDeferred.reject();
            };

            req.onupgradeneeded = function (evt) {
                console.log('openDb.onupgradeneeded');
                var db = evt.target.result;
                var store = db.createObjectStore('sessioni', {keyPath: 'idSession'});

                store.createIndex('by_url', 'url', {unique: false});
                store.createIndex('by_startDate', 'startDate', {unique: false});
                store.createIndex('by_endDate', 'endDate', {unique: false});
            };

        }
        return openDbDeferred.promise();
    }

然后我创建了一个函数来检索数据库中的所有数据:

getFilesList: function () {
        var getDataDeferred;
        return this.openDb('session-db', 1).then(function (db) {
            console.log('Find all records...');

            getDataDeferred = $.Deferred();
            var tx = db.transaction("sessioni", "readwrite");
            var store = tx.objectStore("sessioni");
            var items = [];

            tx.oncomplete = function() {
                //console.log(items);
                getDataDeferred.resolve(items);
                console.log('Transazione getFilesList completata');
            };

            tx.onfailure = function(evt) {
                getDataDeferred.reject();
                console.error('[ERROR] Transazione getFilesList fallita: ' + evt);
            };

            var cursorRequest = store.openCursor();

            cursorRequest.onsuccess = function (evt) {
                var cursor = evt.target.result;
                if (cursor) {
                    items.push(cursor.value);
                    cursor.continue();
                }
            };
            cursorRequest.onerror = function (error) {
                console.error('findAll [ERROR]: ' + error);
            };
        });

        return getDataDeferred.promise();
    }

我在另一个 Controller 中声明了这个 Controller 来调用 getFilesList 函数:

retreiveAllData: function() {
        return this.sessionManageModel.getFilesList().than(function(items) {
            console.log(items)
            return items;
        });
    }

调用 retreiveAllData 函数时,它返回“undefined”,因为项目是“undefined”。

如何获取retreiveAllData函数中的项目?

最佳答案

您的 getFilesList 函数中有两个 return 语句。第二个实际上应该在 then 回调中 - 如您所见,它当前返回 undefined

getFilesList: function () {
    // no need to declare deferred variable outside of the callback
    return this.openDb('session-db', 1).then(function (db) {
        var getDataDeferred = $.Deferred();
        … // do all the stuff
        return getDataDeferred; // place the `return` here
    }); 
    // not here!
}

关于javascript - IndexedDb 的延迟 then of then 是未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29016797/

相关文章:

javascript - 具有正数或负数的百分比函数

jquery - 正则表达式匹配精确的单词并将匹配转换为标签

javascript - 如果使用 Javascript 字符串中的前 4 位数字为零,如何生成警报

Electron IndexedDb 限制?

firefox - 如何在firefox中查看IndexedDB内容

javascript - 错误 :Object #<ui> has no method 'containsLatLng'

javascript - 类标签不要删除

javascript - 未选择 IF radio

jquery - "Uncaught TypeError: Cannot set property ' left ' of undefined"使用内容脚本 Chrome 扩展中的 jQuery

laravel - 如何使用 Dexie 将数据库与远程数据库同步