使用游标循环将JS对象添加到数组中

Adding JS objects to an array using a cursor loop

本文关键字:添加 数组 对象 JS 游标 循环      更新时间:2023-09-26

我正试图在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 */);