在调用消费方法后分配时如何执行回调
How does a callback get executed when assigned after consuming method got called
问题:
我正在阅读一本关于 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 回调?
我错过了什么?
编辑:
在 James 的评论之后,我发现我的问题缺少 link:
Say it with me now: async programming does not necessarily mean multi-threaded. Javascript is a single-threaded runtime - you simply aren't able to create new threads in JS because the language/runtime doesn't support it.
来源:How does Asynchronous programming work in a single threaded programming model?
解决方案:
正如 James 在下面的回答中指出的那样,像 indexedDB.open() 这样的异步函数被推入一个称为“事件循环”的特殊队列中:
The event loop is a special queue for callback functions. When an async code is executed, a callback is then pushed into the queue. The Javascript engine will only execute the event loop if the code after the async function has finished executing.
来源:http://www.hiddenwebgenius.com/blog/guides/understanding-javascripts-asynchronous-code/
如果 indexedDB.open 异步执行请求,则在您的代码放弃控制之前请求不会完成,因此 request.onsuccess 届时已分配。
Javascript 在浏览器中是单线程的,因此在分配 onsuccess / onerror 之前请求不可能完成