javascript - IndexedDB 成功与不必要的比赛
问题描述
我用新版本号打开 indexedDB
var R = indexedDB.open("myDB", 2); // <- new version
R.onupgradeneeded = longRunningFunction;
R.onsuccess = longRunningFunction2;
现在我需要在两个长时间运行的函数完成时运行一个函数。什么代码模式适合这个?
解决方案
使用承诺或回调。等待成功事件触发,完成它的工作,然后解决一个承诺或调用一个回调。然后,您可以在该承诺解决后或调用回调时执行某些操作。
编辑,这是一个粗略的例子:
function myOpenIndexedDB(name, version, onupgradeneeded) {
return new Promise((resolve, reject) => {
var request = indexedDB.open(name, version);
request.onupgradeneeded = onupgradeneeded;
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
function myOnUpgradeNeeded(event) {
console.log('Performing database upgrade');
const openRequest = event.target;
// just to demonstrate
const versionChangeTransaction = openRequest.transaction;
versionChangeTransaction.oncomplete = () => {
console.log('The version change transaction completed ' +
'which basically means the upgradeneeded handler completed');
};
}
async function main() {
console.log('Connecting to database');
const indexedDbConn = await myOpenIndexedDB('myDb', 2, myOnUpgradeNeeded);
console.log('Connected to database', indexedDbConn.name);
// Do more stuff
await runSomeQuery(indexedDbConn);
}
// Run the example
main().catch(console.error);
引文
有关详细信息,请参阅中的浅绿色突出显示的块
推荐阅读
- javascript - 在为动态内容添加事件侦听器时如何检查父母(和祖父母)类?
- shell - tcl 中的“%”是什么意思?
- javascript - 用 concatted where 续集作用域
- xamarin - 将通知推送到 xamarin 表单 android/ios 上的特定设备
- java - 如何在 Spring JPA 中显式关闭数据库连接?
- webots - Webots R2019 OSM 导入器仅生成树
- php - Foreach as ...我做错了什么?
- javascript - Symfony - 通过事件订阅者将客户端重定向到新路由
- puppet - 在 Hiera 中检索高级哈希键名称
- caching - 启用 gzip 压缩 prestashop 1.7.2.4