我正在尝试在IndexedDB中重新创建我的mySQL / PHP项目(“新标签”样式的页面,该页面存储带有重点色,文件夹和快速拨号/固定部分的书签),以实现客户端存储解决方案(希望将其移至Chrome扩展程序)。
我想认为我对JS有一定的了解,但是我无法弄清楚为什么以下内容仅返回一个空数组。从我可以看到,“ response”数组是在函数开始时声明的,因此应该可由其中的从属函数访问。粘贴在控制台日志中确实表明已成功将数组与由游标迭代创建的对象一起推入,但是一旦游标完成,响应将保留为空。
// Specify index and key value OR omit for all
function getItems(ind,key) {
var response = [];
var transaction = db.transaction(["items"],"readonly");
var store = transaction.objectStore("items");
// If args are omitted - grab all items
if(!ind | !key) {
var cursor = store.openCursor();
cursor.onsuccess = function(e) {
var res = e.target.result;
if(res) {
var r = {
"name": res.value['name'],
"url": res.value['url'],
"folder": res.value['folder'],
"colour": res.value['colour'],
"dial": res.value['dial'],
"order": res.value['order']
};
response.push(r);
res.continue();
}
return response;
}
} else {
// If both args are specified query specified index
store = store.index(ind);
var range = IDBKeyRange.bound(key, key);
store.openCursor(range).onsuccess = function(e) {
var res = e.target.result;
if(res) {
var r = {
"name": res.value['name'],
"url": res.value['url'],
"folder": res.value['folder'],
"colour": res.value['colour'],
"dial": res.value['dial'],
"order": res.value['order']
};
response.push(r);
res.continue();
}
return response;
}
}
}
我是不是很愚蠢,在这里错过了一些东西?
当你写的时候:
cursor.onsuccess = function(e) {
...
return response;
}
您正在从该匿名事件处理程序返回一个值(该值将被忽略)。到该处理程序执行时,对getItems()
自身的调用已经完成很长时间了。您不能简单地return
通过异步操作(如游标迭代)产生一个值。
尝试以下方法:
function getItems(callback, ind, key) {
var response = [];
var transaction = db.transaction(["items"],"readonly");
var store = transaction.objectStore("items");
transaction.oncomplete = function() { callback(response); };
...
}
并将其称为:
getItems(function(response) {
for (var i = 0; i < response.length; ++i) {
console.log(response[i]);
}
} /* ind, key */);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句