我正在使用IndexedDB,我意识到我并没有真正使用JavaScript进行事件处理。
所以这是代码:
var request = indexeddb.open(bla, version);
request.onsuccess = function (event) { };
所以open方法返回一个IDBOpenDBRequest对象,根据Mozillas网站,该对象继承自IDBRequest,除了属性和方法之外还有事件处理程序,其中一个正在成功:
https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest.onsuccess
因此,在Mozilla网站上,onsuccess只是function () { }
现在,当数据库成功打开时,会触发“onsuccess”事件并调用适当的事件处理程序,在本例中是我定义的函数。但究竟是怎么发生的?
请求变量包含IDBOpenDBRequest的实例。所以当我写request.onsuccess = somefunction()时,我是否覆盖了IDBRequest类的默认函数?
我不明白为什么我可以写request.onsuccess = somefunction(event) { }
以及如何将事件传递给该函数。
编辑:
function myObect() {
this.open = function(a,b,c) {
if (c > 20) {
this.success("String");
}
};
};
var myrequest = new myObect();
myrequest.open(4,2,21);
myrequest.success = function (ev) {
console.log(ev);
};
答案 0 :(得分:3)
要创建类似的api,您可以执行以下操作:
function open(a, b, c) {
var request = {};
if(c > 20) {
setTimeout(function() {
if(typeof request.success === "function") {
request.success("String");
}
}, 1);
}
return request;
}
var myrequest = open(4, 2, 21);
myrequest.success = function(ev) {
console.log(ev);
};
这里,setTimeout
是异步的,因此回调函数不会立即执行。当在JavaScript中运行任何异步任务时,当前正在执行的代码将在调用任何回调之前运行完成。因此,success
保证在调用request.success
之前设置。
Indexed DB open
调用类似地运行异步任务,然后在完成时调度事件,最终将调用您的回调函数。
答案 1 :(得分:0)
我覆盖了IDBRequest-class的默认函数
看起来没有默认行为,因此您只需设置自己的功能。