问题:
我正在读一本关于Html5数据存储IndexedDb的书。IndexedDb API使用以下代码打开数据库连接:
var request = indexedDB.open('some name');
request.onsuccess = function(event) {
obj.id = event.target.result
}
request.onerror = function(event) {...}
请求变量被分配了一个回调,该回调在请求成功执行时被调用。但在这些行之后,请求永远不会被调用。所以我的问题是:
onsuccess回调是如何执行的?它不能在indexedDB.open方法中,因为那里还没有分配onsuccess回调?
我错过了什么?
编辑:
在詹姆斯的评论之后,我发现了我问题的缺失链接:
现在和我一起说:异步编程并不一定意味着多线程。Javascript是一个单线程运行时-您根本无法在JS中创建新线程,因为语言/运行时不支持它。
来源:异步编程是如何在单线程编程模型中工作的?
解决方案:
正如James在下面的回答中指出的那样,像indexedDB.open()这样的异步函数被推入一个称为"事件循环"的特殊队列:
事件循环是回调函数的一个特殊队列。当异步代码被执行时,回调被推入队列。只有在异步函数执行完毕后的代码,Javascript引擎才会执行事件循环。
来源:http://www.hiddenwebgenius.com/blog/guides/understanding-javascripts-asynchronous-code/
如果indexedDB.open异步执行请求,那么在您的代码放弃控制之前,请求不会完成,因此此时request.onsaccess将被分配。
浏览器中的Javascript是单线程的,因此在onsuccess/onerror被分配