gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:26:58 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com