【问题标题】:Javascript under the hood引擎盖下的 Javascript
【发布时间】:2016-03-11 17:40:18
【问题描述】:

我不是 javascript 程序员,但我试图了解异步编程背后的原因,而带有回调的 javascript 实现似乎很简单。 我知道 Javascript 有一个主循环,它执行类似的操作

while(1){
        event = EventStack.pop()
       RunCallBacks(event)
    }

但是让我们假设我正在进行一些 I/O 调用。在 I/O 成功后,谁将该事件放入堆栈?是否有一些后台线程始终在监听操作系统并提供事件堆栈?

编辑:

感谢 elclanrs 会议链接,我更了解正在发生的事情。 但是仍然缺少一些东西。例如,如果我要开发 xmlhttprequest javascript api,这是正确的方法吗? (这是非常简化的伪代码,我只是想了解一下大局)

Global UrlStack  # a global url stack shared by all threads
Sockets = [] # list of sockets to read from
while(1){
url = UrlStack.pop() # pop the first url in the stack
socket = CreateSocket() # create socket and send request
socket.connect(url, someport)
socket.send(request)
Sockets.append(socket)
s = select(Sockets, timeout = 0)  # use the select function provided by the OS to wait for the first readable socket
if (s is not empty){
addCorrespondingCallbacksToTheCallBackQueue()
}
}

然后,当一些 javascript 代码想要发出异步 http 请求时,我只需将 url 添加到 UrlStack。这是正确的做法吗?

【问题讨论】:

标签: javascript asynchronous io


【解决方案1】:

是的;浏览器提供了一些基本的 API 来支持这种异步队列回调。

作为一名 JavaScript 开发人员,我们的工作本质上是为某些浏览器事件注册回调(即,如果用户单击某物,如果 HTTP 请求返回等)。当浏览器事件发生时,浏览器会检查是否有任何注册的回调。如果是这样,它将将该回调添加到事件队列中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多