我试图从索引的数据库中获取某个键的值并将它们添加到数组中,此数组在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
}
}
答案 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);
}
}