【问题标题】:How does a callback get executed when assigned after consuming method got called调用消费方法后分配时如何执行回调
【发布时间】: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


【解决方案1】:

如果 indexedDB.open 异步执行请求,那么在您的代码放弃控制权之前,请求不会完成,因此 request.onsuccess 将在那时分配。

浏览器中的 Javascript 是单线程的,因此在分配 onsuccess / onerror 之前不可能完成请求

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    相关资源
    最近更新 更多