调用消费方法后,如何在分配回调时执行回调

How does a callback get executed when assigned after consuming method got called

本文关键字:回调 分配 执行 方法 调用      更新时间:2024-03-03

问题:

我正在读一本关于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被分配

之前,请求不可能完成