等待IDBCursor.onsuccess完成

时间:2012-10-17 20:40:58

标签: javascript asynchronous indexeddb

我有一个IndexedDB,包含页面上各种元素的属性。我在其中一个属性上有一个索引,我使用一个键范围来获得一个特定的结果列表。

var key = IDBKeyRange.bound(10, 20);
var cursor = store.index('property').openCursor(key);

我遇到的问题是cursor.onsuccess功能。它似乎对结果集中的每个结果执行。因此,一旦解析了所有结果,我就无法执行回调函数。

cursor.onsuccess = function (e) {
    var cursor = e.target.result;
    if (cursor) {
        if (cursor.value.prop1 > 30 && cursor.value.prop2 < 80) {
            // Do stuff with result
            someArray.push({
                prop1: cursor.value.prop1,
                prop2: cursor.value.prop2
            }):
        }
    }
    cursor.continue();
};

2 个答案:

答案 0 :(得分:1)

事实证明,cursor.onsuccess最后一次以e.target.result未定义的方式触发。发生这种情况时,您可以执行回调函数:

cursor.onsuccess = function (e) {
    var cursor = e.target.result;
    if (cursor) {
        if (cursor.value.prop1 > 30 && cursor.value.prop2 < 80) {
            // Do stuff with result
            someArray.push({
                prop1: cursor.value.prop1,
                prop2: cursor.value.prop2
            }):
        }
    } else {
        // Execute code here
        console.log('There are ' + someArray.length + ' elements in someArray.');
    }
    cursor.continue();
};

答案 1 :(得分:1)

知道您的操作已完成的最安全方法是在完成事件上使用事务。光标关闭后会触发此事件。

transaction.oncomplete = function (event) {
    console.log('transaction completed');
};

另外,为确保没有发生错误,请在错误和中止时向事务事件添加事件侦听器。

transaction.onerror = function (event) {
    console.log('transaction error');
};

transaction.onabort = function (event) {
    console.log('transaction abort');
};