我有一个包含数百个对象的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回调中进行。否则,我将在前一个完成之前发出一个写入,这是非法的。
这似乎是不可能的,因为写入是异步的,所以"onsuccess“回调将在调用write之后返回,从而结束事务并使游标无效,即使它是在闭包中捕获的。
关于这一点我说得对吗?我将对它进行编码,以便在内存中累积整个对象集合,这样我就可以在游标完成后编写它们,尽管这不是我的首选。
(注意:我不认为有同步编写的形式,但是,即使有,我也不能使用它,因为这段代码将在Chrome应用程序中使用。)
发布于 2013-12-04 16:51:34
只要在两个异步处理器之间有足够的缓冲区,就可以这样做。
我有一些博客是如何做到这一点here
考虑使用来自大型分隔文本的记录来填充存储区。为了避免占用内存来保存所有记录,CsvStreamer使用HTTP Range头分块下载数据,并在读取记录时调用下一个回调。数据块包含多条记录,在这种情况下,CsvStreamer同步写入。在等待下一块数据时,CsvStreamer异步调用next回调。
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事务期间将对象写入文件?
简短的回答是:不。
https://stackoverflow.com/questions/20362184
复制相似问题