一个IndexedDB数据库可以如下所示创建:
let request = indexedDB.open('testDB');
IndexedDB的许多操作都不是“调用–返回”类型的,而是“调用–请求”类型的。上面的代码就是典型。indexedDB.open
方法返回的并不是一个数据库对象,而是一个IDBOpenDBRequest
对象,从名字上可以看出来这是一个请求创建数据库的对象。
而真正的数据库对象是在IDBOpenDBRequest
对象的result
字段中
不过并不是说indexedDB.open
方法执行之后就可以直接访问返回的IDBOpenDBRequest
对象的result
字段来获取数据库对象。因为 indexedDB.open
方法是一个异步的API,如果直接访问返回值则会报错。例如:
let request1 = indexedDB.open('test');
console.log(request.result);
上面两行语句运行的结果如下图:
因为在访问result
字段的时候,创建数据库的请求还未完成,于是便会报错。
解决异步的问题,通常的解决方法就是回调函数。IDBOpenDBRequest
对象定义了三个回调函数:
onerror
:请求失败的回调函数onsuccess
:请求成功的回调函数onupgradeneeded
:数据库版本变化回调函数
创建数据库的时候,用onsuccess
回调函数就可以了。
下面是一个完整的过程:
let db;
let request = indexedDB.open('testDB');
request.onsuccess = () => {
db = request.result;
}