我有一个包含数百个对象的objectStore,我可以使用以下代码查看:
db // already set by call to window.indexedDB.open
.transaction(["mailing-list"])
.objectStore("mailing-list")
.openCursor()
.onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
console.log(cursor.value);
cursor.continue();
}
};
我想要做的是使用FileWriter写出检索到的每个对象;我不想在巨大的数组中累积所有对象并立即将它们全部写出来。我也不想为每个对象启动单独的事务,因为我想使用游标迭代所有对象。 (不关心他们的钥匙。)
我会调用fileWriter.write来调用console.log。对cursor.continue()的调用将在onwrite回调中。否则,我会在前一个写完之前发出一个写,这是非法的。
这似乎是不可能的,因为,由于写入是异步的,因此在调用write之后将返回“onsuccess”回调,从而结束事务并使游标无效,即使它在闭包中被捕获。
我是对的吗?我要对它进行编码以在内存中累积整个对象集合,所以我可以在光标完成后编写它们,尽管这不是我的第一选择。
(注意:我认为没有同步的写作形式,但是,即使有,我也无法使用它,因为此代码将在Chrome应用程序中。)
答案 0 :(得分:0)
只要两个异步处理器之间有足够的缓冲区,就可以这样做。
我的博客有点如何完成here:
考虑使用大分隔文本中的记录填充商店。为了避免保留用于保存所有记录的内存,CsvStreamer使用HTTP Range标头按块下载数据,并在读取记录时调用下一个回调。一大块数据包含多个记录,在这种情况下,CsvStreamer同步写入。在等待下一个数据块时,CsvStreamer异步调用下一个回调。
var db = new ydn.db.Storage(db_name, schema, options);
var stream = new CsvStreamer(url);
var isSerial = false;
var tdb = db.thread('multi', isSerial); // multi-request parallel transactions
var putData = function(data) {
if (data) {
tdb.put('store1', data).then(function() {
stream.next(function (data) {
putData(data);
}), function(e) {
throw e;
});
}
});
stream.next(function (data) {
putData(data);
}
如果事务仍处于活动状态,则可以重用该事务。否则创建一个新的交易。
编辑:
是的,上面的例子是写idb,而你想读。管道异步处理器时,您需要关注最慢的处理器,即FileWriter。这是一个例子:
var dump = function(marker) {
var q = marker ? db.from('store name', '>', marker) : db.from('store name');
q.open(function(cur) {
var cb = writeToFile(cur.getValue());
if (cb) { // wait me callback
var next_key = cur.getKey();
cb(function() {
dump(next_key); // notice de-referencing cur, though not necessary
});
cb = null; // also not necessary, but better be on safe side of memory leak
return null; // stop continuing cursor
} else { // file writer said, good to call me again
return undefined; // continue cursor
}
}, iter, 'readonly');
}
dump();
在IndexedDb事务期间是否可以将对象写入文件?
简短回答:不。