我有以下代码:

html5DB.indexedDB.addSomething = function(foo) {
    var db = html5DB.indexedDB.db;
    var trans = db.transaction(["something"], "readwrite");
    var store = trans.objectStore("something");

    var isExisting = IsAlreadyExist(foo);
    // How to wait for that instruction to finish?

    if (!isExisting){
       var request = store.put({
           "text": foo,
           "timeStamp" : new Date().getTime()
       });
    }
};


我试图了解如何等待功能IsAlreadyExist完成。此函数打开一个游标以在对象存储中进行迭代,以确定是否存在特定值。

实际上,没有错误,但是我无法访问if (!isExisting)中的代码,因为变量的值永远不会改变。

这是第二个函数的代码:

function IsAlreadyExist(foo){
    var db = html5DB.indexedDB.db;
    var objectStore = db.transaction("something").objectStore("something");

    objectStore.openCursor().onsuccess = function(event) {
        var cursor = event.target.result;

        if (cursor) {
            if (cursor.value.text == foo)
                return true;

            cursor.continue();
       }
    };

    return false;
}


有没有办法等待执行结束?还是这不是检查值是否存在的好方法?

最佳答案

由于IndexedDB是异步API,因此您必须等待直到使用回调完成操作。

首先,我们需要重构IsAlreadyExist方法:

function IsAlreadyExist(foo, oncomplete) {
    var db = html5DB.indexedDB.db;
    var transaction = db.transaction("something");
    var objectStore = transaction.objectStore("something");

    var exists = false;

    objectStore.openCursor().onsuccess = function(event) {
        var cursor = event.target.result;

        if (cursor) {
            if (cursor.value.text == foo) {
                exists = true;
                return;
            }

            cursor.continue();
       }
    };

    transaction.oncomplete = function () {
        oncompleted(exists);
    };
}


现在,我们将重构您的其他方法:

html5DB.indexedDB.addSomething = function(foo) {
    IsAlreadyExist(foo, function (isExisting) {
        if (!isExisting){
           var db = html5DB.indexedDB.db;
           var trans = db.transaction(["something"], "readwrite");
           var store = trans.objectStore("something");

           var request = store.put({
               "text": foo,
               "timeStamp" : new Date().getTime()
           });
        }
    });
};


因此,在这里您将看到我们正在传递函数,以将游标搜索作为回调完成,该回调接收状态的参数。

这可能会变得有些丑陋,这就是Promise在JavaScript中流行的原因。我为IndexedDB编写了一个包装程序,该包装程序使用了基于Promise的API,称为db.js

关于javascript - 等待openCursor在IndexedDB中完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22083646/

10-12 12:28
查看更多