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

Adding JS objects to an array using a cursor loop

我正在尝试在 IndexedDB 中为客户重新创建一个我的 mySQL/PHP 项目(一个 "new tab" 样式页面存储带有强调色的书签、文件夹和快速拨号/固定部分)端存储解决方案(希望将其移动到 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 */);