我不是一个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。这是正确的方法吗?
答案 0 :(得分:0)
是;浏览器提供了基本API,支持这种回调的异步排队。
作为JavaScript开发人员,我们基本上做的是为某些浏览器事件注册回调(即,如果用户点击某些内容,如果HTTP请求返回,等等)。当浏览器事件发生时,浏览器会检查是否有任何已注册的回调。如果是这样,它会将该回调添加到事件队列中。