【问题标题】:Deferred then of then is undefined for IndexedDb对于 IndexedDb,未定义 then 的 Deferred then of then
【发布时间】:2015-03-12 17:47:44
【问题描述】:

我正在使用 CanJs,我正在学习 jquery deferred,但我遇到了问题。 我创建了一个类似于 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();
    }

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

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

当调用 retreiveAllData 函数时,它返回 'undefined' 因为 items 是 'undefined'。

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

【问题讨论】:

  • 您是否正确复制了此代码?你拼错了“then”。

标签: javascript jquery indexeddb jquery-deferred canjs


【解决方案1】:

您的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!
}

【讨论】:

  • 我是只返回延迟的,如您所写,还是返回 getDataDeferred.promise()?
  • 一个 deferred 是一个 thenable,并且应该被任何 Promise 库正确吸收。您可以同时使用这两种变体。
  • 它有效...但我还有另一个问题。当我调用 retreiveAllData 函数时,如下所示: var itemList = sessionManage.retreiveAllData();它记录更正的元素,但在 itemList 我没有相同的项目内容(它似乎返回延迟)。为什么?
  • 因为retrieveAllData()的返回值是一个promise?它是异步的,您无法获取内容。日志记录工作正常,那又如何?
  • 我刚才不是说它是异步的,你不能同步获取promise的值吗?只需在上面加上 then,就像你在 retrieveAllData 中所做的那样:…then(function(items) { console.log(items); /* you have the same values here */ return items; });
猜你喜欢
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多