gpt4 book ai didi

javascript - 调用消费方法后分配的回调如何执行

转载 作者:行者123 更新时间:2023-12-02 16:26:28 24 4
gpt4 key购买 nike

问题:

我正在读一本关于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 回调尚未分配?

我错过了什么?

编辑:

在詹姆斯发表评论后,我发现我的问题缺少链接:

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 之前不可能完成请求

关于javascript - 调用消费方法后分配的回调如何执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com