填充了IndexedDB对象存储键的值的数组是否无法全局访问?

时间:2014-04-05 00:42:07

标签: javascript arrays asynchronous indexeddb

我试图从索引的数据库中获取某个键的值并将它们添加到数组中,此数组在onsuccess函数中正常工作,但在此之后为空。我按照顺序猜测登录到控制台的两年[0]似乎问题与异步有关。我显然不是真正了解事情的顺序以及如何实现我想要的目标。有人可以帮我理解问题是什么,也许可以指出我正确的方向来克服它。

// the array I want the values in
var years = new Array(); 

// function retrieves all objects between certain years, low and high
function getYears(low, high){  

var request = window.indexedDB.open("matchDB", 1);  
request.onerror = function(event) {console.log("onerror");}

request.onsuccess = function(event) {
var db = event.target.result;
var objectStore = db.transaction(["matches"], 'readonly').objectStore("matches");

var index = objectStore.index("year");
var range = IDBKeyRange.bound(low, high, true, true); 

var request = index.openCursor(range);
  request.onsuccess = function(evt) {
     var cursor = evt.target.result;
     if (cursor) {
        var matchList = cursor.value;
        // the value of the key year is pushed into the array years
        years.push(matchList.year);
        console.log(years[0]); // this works
        cursor.continue();
     }
  }
console.log(years[0]); //this is undefined
}
}

1 个答案:

答案 0 :(得分:1)

request.onsuccess是一个回调函数,在异步请求完成时将被调用。请注意,您只是将函数分配给onsuccess属性,而不是执行该函数。它可以在几秒钟后执行。

其后的代码将在定义后继续执行,因此将立即调用console.log(years [0]),之后将打印出来" undefined"因为回调方法尚未执行。您处理"年"的所有代码应该进入回调。

如果您不想在回调中推送所有代码,只需定义另一个方法并在回调方法中调用它。

function handleRequest(evt) {
    var cursor = evt.target.result;
     if (cursor) {
        var matchList = cursor.value;
        // the value of the key year is pushed into the array years
        years.push(matchList.year);
        console.log(years[0]); // this works
        cursor.continue();
     }
}

var request = index.openCursor(range);
  request.onsuccess = function(evt) {
     handleRequest(evt);
  }
}