操作使用 indexedDB 获得的数据
Manipulating data obtained with indexedDB
我是 IndexedDB 的新手,我无法操作从 indexedDB 获得的数据 table.I 只需要在按下按钮时搜索值,然后用按钮激活的事件开始工作,它必须return 很多结果,可能需要几秒钟才能得到 return 值,所以我需要在回调函数中使用 async / await
。我认为问题是同步的,因为我使回调函数 async
和获取数据的函数 getData()
带有单词 await
,即使如此,我也无法使用数据,因为当我执行 console.log(x)
时,它 return 是 undefined
值。
let db;
let request = window.indexedDB.open("Cities", 1);
request.onerror = function (event) {
console.log("error")
};
request.onsuccess = function (event) {
db = event.target.result;
document.getElementById('search').addEventListener('click', async function () {
let x = await getData();
console.log(x)
})
};
function getData() {
let transaction = db.transaction(["City"], "readwrite");
transaction.oncomplete = function (event) {
document.querySelector('body').innerHTML += '<li>Transaction completed.</li>';
};
transaction.onerror = function () {
document.querySelector('body').innerHTML += '<li>Transaction not opened due to error: ' + transaction.error + '</li>';
};
let objectStore = transaction.objectStore("City");
let objectStoreRequest = objectStore.getAll();
objectStoreRequest.onsuccess = function () {
document.querySelector('body').innerHTML += '<li>Request successful.</li>';
let myRecord;
return myRecord = objectStoreRequest.result;
};
当然,console.log(x)
只是检查得到的数据是否正确,一旦到了那个点就会进入搜索的部分,那是另外一回事了。
我不确定我的问题是 async / await
还是因为我没有正确获取 IndexedDB 数据。有帮助吗?
编辑: -- 我想我已经找到了解决方案,尽管我认为这不是解决问题的最佳方法。我已经在调用事件的函数中移动了函数 getData()
的所有代码,一旦获得数据,我就在 objectStoreRequest
的方法 .onsuccess
中工作,因此我避免了必须使用async / await
,我还在继续处理尚未完成的交易。如果有人知道使它工作的更简洁的方法或向我解释为什么原始 post 代码不起作用,我将不胜感激。
我附上我目前正在使用的代码:
let db;
let request = window.indexedDB.open("Cities", 1);
request.onerror = function (event) {
console.log("error")
};
request.onsuccess = function (event) {
db = event.target.result;
document.getElementById('search').addEventListener('click',function () {
let transaction = db.transaction(["City"], "readwrite");
transaction.oncomplete = function () {
document.querySelector('body').innerHTML += '<li>Transaction completed.</li>';
};
transaction.onerror = function (event) {
document.querySelector('body').innerHTML += '<li>Transaction not opened due to error: ' + transaction.error + '</li>';
};
let objectStore = transaction.objectStore("City");
let objectStoreRequest = objectStore.getAll();
objectStoreRequest.onsuccess = function () {
document.querySelector('body').innerHTML += '<li>Request successful.</li>';
let myRecord;
myRecord = objectStoreRequest.result;
console.log(myRecord)
}
})
};
无论如何,似乎没有人有另一种方法来解决这个问题,所以我要用这个回应来回应这个post。
这是我找到的解决问题的唯一方法,虽然它看起来像一个脏代码,但我认为它可以改进。
let db;
let request = window.indexedDB.open("Cities", 1);
request.onerror = function (event) {
console.log("error")
};
request.onsuccess = function (event) {
db = event.target.result;
document.getElementById('search').addEventListener('click',function () {
let transaction = db.transaction(["City"], "readwrite");
transaction.oncomplete = function () {
document.querySelector('body').innerHTML += '<li>Transaction completed.</li>';
};
transaction.onerror = function (event) {
document.querySelector('body').innerHTML += '<li>Transaction not opened due to error: ' + transaction.error + '</li>';
};
let objectStore = transaction.objectStore("City");
let objectStoreRequest = objectStore.getAll();
objectStoreRequest.onsuccess = function () {
document.querySelector('body').innerHTML += '<li>Request successful.</li>';
let myRecord;
myRecord = objectStoreRequest.result;
console.log(myRecord)
}
})
};
我是 IndexedDB 的新手,我无法操作从 indexedDB 获得的数据 table.I 只需要在按下按钮时搜索值,然后用按钮激活的事件开始工作,它必须return 很多结果,可能需要几秒钟才能得到 return 值,所以我需要在回调函数中使用 async / await
。我认为问题是同步的,因为我使回调函数 async
和获取数据的函数 getData()
带有单词 await
,即使如此,我也无法使用数据,因为当我执行 console.log(x)
时,它 return 是 undefined
值。
let db;
let request = window.indexedDB.open("Cities", 1);
request.onerror = function (event) {
console.log("error")
};
request.onsuccess = function (event) {
db = event.target.result;
document.getElementById('search').addEventListener('click', async function () {
let x = await getData();
console.log(x)
})
};
function getData() {
let transaction = db.transaction(["City"], "readwrite");
transaction.oncomplete = function (event) {
document.querySelector('body').innerHTML += '<li>Transaction completed.</li>';
};
transaction.onerror = function () {
document.querySelector('body').innerHTML += '<li>Transaction not opened due to error: ' + transaction.error + '</li>';
};
let objectStore = transaction.objectStore("City");
let objectStoreRequest = objectStore.getAll();
objectStoreRequest.onsuccess = function () {
document.querySelector('body').innerHTML += '<li>Request successful.</li>';
let myRecord;
return myRecord = objectStoreRequest.result;
};
当然,console.log(x)
只是检查得到的数据是否正确,一旦到了那个点就会进入搜索的部分,那是另外一回事了。
我不确定我的问题是 async / await
还是因为我没有正确获取 IndexedDB 数据。有帮助吗?
编辑: -- 我想我已经找到了解决方案,尽管我认为这不是解决问题的最佳方法。我已经在调用事件的函数中移动了函数 getData()
的所有代码,一旦获得数据,我就在 objectStoreRequest
的方法 .onsuccess
中工作,因此我避免了必须使用async / await
,我还在继续处理尚未完成的交易。如果有人知道使它工作的更简洁的方法或向我解释为什么原始 post 代码不起作用,我将不胜感激。
我附上我目前正在使用的代码:
let db;
let request = window.indexedDB.open("Cities", 1);
request.onerror = function (event) {
console.log("error")
};
request.onsuccess = function (event) {
db = event.target.result;
document.getElementById('search').addEventListener('click',function () {
let transaction = db.transaction(["City"], "readwrite");
transaction.oncomplete = function () {
document.querySelector('body').innerHTML += '<li>Transaction completed.</li>';
};
transaction.onerror = function (event) {
document.querySelector('body').innerHTML += '<li>Transaction not opened due to error: ' + transaction.error + '</li>';
};
let objectStore = transaction.objectStore("City");
let objectStoreRequest = objectStore.getAll();
objectStoreRequest.onsuccess = function () {
document.querySelector('body').innerHTML += '<li>Request successful.</li>';
let myRecord;
myRecord = objectStoreRequest.result;
console.log(myRecord)
}
})
};
无论如何,似乎没有人有另一种方法来解决这个问题,所以我要用这个回应来回应这个post。
这是我找到的解决问题的唯一方法,虽然它看起来像一个脏代码,但我认为它可以改进。
let db;
let request = window.indexedDB.open("Cities", 1);
request.onerror = function (event) {
console.log("error")
};
request.onsuccess = function (event) {
db = event.target.result;
document.getElementById('search').addEventListener('click',function () {
let transaction = db.transaction(["City"], "readwrite");
transaction.oncomplete = function () {
document.querySelector('body').innerHTML += '<li>Transaction completed.</li>';
};
transaction.onerror = function (event) {
document.querySelector('body').innerHTML += '<li>Transaction not opened due to error: ' + transaction.error + '</li>';
};
let objectStore = transaction.objectStore("City");
let objectStoreRequest = objectStore.getAll();
objectStoreRequest.onsuccess = function () {
document.querySelector('body').innerHTML += '<li>Request successful.</li>';
let myRecord;
myRecord = objectStoreRequest.result;
console.log(myRecord)
}
})
};