IndexedDB 等待事件

Wil*_*son 3 javascript indexeddb

我在尝试从对象存储中检索数据时遇到了 IndexedDB 问题。

 function GetLayoutData(key) {

indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
var open = indexedDB.open("DB", 1);

 open.onsuccess = function () {
    db = open.result;
    tx = db.transaction("Store", "readwrite");
    var store = tx.objectStore("Store");

    store.get(key).onsuccess =  function (event) {
        console.log(event.target.result);
        return event.target.result;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我有一个函数,我想返回检索到的值,以便我可以使用它来设置和输入元素,问题是该函数不等待事件并且只返回任何内容,因为它还没有任何数据。函数看起来像这样我怎么能告诉它在返回之前等待“onsuccess”完成?

任何帮助都非常有用。

san*_*oco 6

可能的解决方案Promise;

function getLayoutData (key) {
    return new Promise (function(resolve) {
        indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
        var open = indexedDB.open ("DB", 1);

        open.onsuccess = function () {
            db = open.result;
            tx = db.transaction("Store", "readwrite");
            var store = tx.objectStore("Store");

            store.get(key).onsuccess =  function (event) {
                return resolve(event.target.result);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

然后像这样实现它:

getLayoutData().then(function(result) {
    // Do whatever you want with the data
});
Run Code Online (Sandbox Code Playgroud)

通常,您需要一个(promise polyfill)才能使其与尚不支持 promise 的浏览器(例如 IE)一起使用。由于 IE 无论如何都不支持 indexedDB,因此您不必在这种情况下使用它。