首页 > 解决方案 > IndexedDB 成功与不必要的比赛

问题描述

我用新版本号打开 indexedDB

var R = indexedDB.open("myDB", 2); // <- new version
R.onupgradeneeded = longRunningFunction;
R.onsuccess = longRunningFunction2;

现在我需要在两个长时间运行的函数完成时运行一个函数。什么代码模式适合这个?

标签: javascriptconcurrencyevent-handlingindexeddb

解决方案


使用承诺或回调。等待成功事件触发,完成它的工作,然后解决一个承诺或调用一个回调。然后,您可以在该承诺解决后或调用回调时执行某些操作。

编辑,这是一个粗略的例子:

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);

引文

有关详细信息,请参阅中的浅绿色突出显示的块


推荐阅读