IndexedDB游标

3
我的问题非常简单。我无法理解来自MDN文章有关在IndexedDB中迭代结果的示例。具体而言,我看不到任何用于迭代的循环。没有for/while/do循环。以下是示例:
function displayData() {
  var transaction = db.transaction(['rushAlbumList'], "readonly");
  var objectStore = transaction.objectStore('rushAlbumList');

  objectStore.openCursor().onsuccess = function(event) {
    var cursor = event.target.result;
    if(cursor) {
       var listItem = document.createElement('li');
       listItem.innerHTML = cursor.value.albumTitle + ', ' + cursor.value.year;
       list.appendChild(listItem);  

       cursor.continue();
    } else {
       console.log('Entries all displayed.');
    }
  };
};
1个回答

6
“循环”是隐式发生的。每次光标成功移动都会触发一个“成功”事件,这将触发对请求的“onsuccess”属性分配的处理程序的调用。因此,迭代发生在以下代码行中:
cursor.continue();

谢谢,我明白了。这种方法相当丑陋。我更喜欢显式循环。不过还是感谢您的解释... - Jiří Lechner
3
@JiříLechner 该机制是异步的,因为对数据库的访问可能需要(一小段)时间。 - Pointy
indexedDB旨在以声明方式而非命令式方式使用。随着一些javascript功能在新版本中的更改,今年晚些时候您有机会编写命令式异步js。但我不会让您抱太大希望,建议学习如何编写声明性代码。 - Josh
虽然这可能有效(我真的不知道),但我从未见过它被写成这样。上面例子中的 if(cursor) 总是被写成 while(cursor) - 也许自从这个问答出现以来有所改变,但以防其他人也感到困惑而来到这里。 - Morvael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接