首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在IndexedDb事务期间将对象写入文件?

是否可以在IndexedDb事务期间将对象写入文件?
EN

Stack Overflow用户
提问于 2013-12-04 05:36:19
回答 1查看 495关注 0票数 0

我有一个包含数百个对象的objectStore,我可以使用如下代码进行查看:

代码语言:javascript
复制
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应用程序中使用。)

EN

回答 1

Stack Overflow用户

发布于 2013-12-04 16:51:34

只要在两个异步处理器之间有足够的缓冲区,就可以这样做。

我有一些博客是如何做到这一点here

考虑使用来自大型分隔文本的记录来填充存储区。为了避免占用内存来保存所有记录,CsvStreamer使用HTTP Range头分块下载数据,并在读取记录时调用下一个回调。数据块包含多条记录,在这种情况下,CsvStreamer同步写入。在等待下一块数据时,CsvStreamer异步调用next回调。

代码语言:javascript
复制
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。下面是一个例子:

代码语言:javascript
复制
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事务期间将对象写入文件?

简短的回答是:不。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20362184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档