【发布时间】:2015-04-23 02:18:29
【问题描述】:
问题:
我正在阅读一本关于 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 中创建新线程,因为语言/运行时不支持它。
来源:How does Asynchronous programming work in a single threaded programming model?
解决方案:
正如 James 在下面的回答中指出的那样,像 indexedDB.open() 这样的异步函数被推入一个称为“事件循环”的特殊队列中:
事件循环是回调函数的特殊队列。当异步代码被执行时,回调被推入 队列。只有异步函数执行完毕后的代码,Javascript 引擎才会执行事件循环。
来源:http://www.hiddenwebgenius.com/blog/guides/understanding-javascripts-asynchronous-code/
【问题讨论】:
-
如果 indexedDB.open 异步执行请求,那么在您的代码放弃控制权之前,请求不会完成,因此 request.onsuccess 将在那时分配。浏览器中的 Javascript 是单线程的,因此在分配 onsuccess / onerror 之前没有机会完成请求。
-
您是否对从未执行的回调有问题,或者它确实执行了但您不明白这是怎么回事?
-
实际执行了,不明白为什么会这样
-
@James:我不明白 JavaScript 不能创建其他线程。我现在明白了。你基本上已经给我答案了。
-
您应该自行回答并接受此问题,以表明该问题已得到回答。或者让 @JamesGaunt 回答它,这样它就不会出现在未回答的问题列表中。
标签: javascript jquery asynchronous indexeddb