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

时间:2013-12-03 21:36:19

标签: javascript indexeddb filewriter

我有一个包含数百个对象的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应用程序中。)

1 个答案:

答案 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事务期间是否可以将对象写入文件?

简短回答:不。