引擎盖下的Javascript

时间:2016-03-11 17:40:18

标签: javascript asynchronous io

我不是一个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。这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

是;浏览器提供了基本API,支持这种回调的异步排队。

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

相关问题