javascript - 在某些功能完成之前触发 OnComplete (Javascript/IndexedDB)

标签 javascript indexeddb

我正在使用 IndexedDB 在我正在开发的应用程序上离线存储数据。我的问题是事务的 OnComplete 在负责存储数据的函数完成之前被触发。我需要知道如何让 OnComplete 等待这个函数在被解雇之前完成它的工作。

这就是我到目前为止所拥有的...函数 populateDatabase 用于存储数据。为此,里面还有另外两个。

function populateDatabase() {
  var i = 0;
  requestFileSystem(LocalFileSystem.PERSISTENT, 0, obtainDataFile, onError);
  try {
    if (localDatabase != null && localDatabase.db != null) {
      console.log('Started adding records');

      var transaction = localDatabase.db.transaction(osTableName, "readwrite");
      if (transaction) {
        transaction.oncomplete = function(event) {
          console.log("transaction completed.");
          localDatabase.db.close();
        }
        transaction.onabort = function(event) {
          console.log("transaction aborted.");
          localDatabase.db.close();
        }
        transaction.ontimeout = function(event) {
          console.log("transaction timeout.");
          localDatabase.db.close();
        }

        var store = transaction.objectStore(osTableName);
        if (data.length > 0)
        {
          if (store)
            addData(transaction, store, data, 0, true);
        }

      }
      console.log('Finished adding records');
    }
  } catch (e) {
    console.log(e.message);
  }
}

obtainDataFile,基本上从 txt 文件中读取数据并存储在数据变量中

function obtainDataFile(fileSystem) {
  var directoryEntry = fileSystem.root;
  directoryEntry.getFile("EstoqueCSV.txt", {
    create: true,
    exclusive: false
  }, function(fileEntry) {
    fileEntry.file(function(file) {
      var reader = new FileReader();
      reader.onloadend =
        function(evt) {
          var csv = evt.target.result;
          data = $.csv.toObjects(csv);
        };
      reader.readAsText(file);
    }, onError)
  }, onError);
}

并且这个递归函数用于循环遍历数据数组,以便一个一个地存储寄存器。

function addData(txn, store, records, i, commitT) {
  try {
    if (i < records.length) {
      var rec = records[i];
      var req = store.add(rec);
      req.onsuccess = function(ev) {
        i++;
        console.log("Adding record " + i);
        addData(txn, store, records, i, commitT);
      }
      req.onerror = function(ev) {
        console.log("Failed to add record." + "  Error: " + ev.message);
      }
    } else if (i == records.length) {
      console.log('Finished adding ' + records.length + " records");
    }
  } catch (e) {
    console.log(e.message);
  }
}

问题是我的代码在 addData 函数完成之前到达了 transaction.oncomplete。我不确定在这种情况下我应该做什么。我一直在寻找与异步调用、回调函数等相关的主题,但仍然无法解决。

在此先感谢您的帮助。

最佳答案

您必须在开始交易之前加载所有数据。从您的代码中,我没有看到 data 已加载。否则,您的代码看起来是正确的。

关于javascript - 在某些功能完成之前触发 OnComplete (Javascript/IndexedDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079610/

相关文章:

javascript - IndexedDB - ObjectStores vs 多个数据库 vs 索引?

javascript - Indexeddb 中止错误

javascript - 谷歌折线图只有完整的步骤/刻度

javascript - Google map Javascript API 查看位置

javascript - 如何捕获在富文本编辑器 div 中输入的内容 - Quill rich editor

javascript - 客户端从 IndexedDB 延迟加载到 DataTables jquery 插件

node.js - 当 puppeteer 关闭 Chrome 时,indexedDB 不会保留数据库、存储或值

google-chrome - Chrome 上的 IndexedDB 刷新到磁盘

javascript - Select2 val 不适用于整数值

javascript - CSS如何使用此下拉功能使图像可点击?