我想知道JavaScript回调是如何工作的。我特别不理解异步XmlHttpRequest
是如何工作的。JS如何确定服务器(在一个线程中)返回了一些值,以及何时调用回调方法?它是建立在计时器上的吗?
这里更详细地回答了一个非常相似的问题。
基本答案是,底层网络是在操作系统级别进行的,当传入的网络数据包到达时,可能会有线程或某种类型的通知。当结果完成后,将向javascript事件队列中添加一个事件。当该事件到达事件队列的顶部并且javascript准备对其执行操作时,将触发适当的javascript ajax事件,从而启动javascript链,从而调用回调。
超时可能涉及一些定时器,但定时器不用于知道ajax响应何时到达。这是基于浏览器使用的操作系统级网络支持。
您不会使用定时器,因为您无法判断它们何时应该触发。
我想它是使用某种堆栈/队列[列表或表]来跟踪调用,并根据返回的信息关闭响应函数,告诉您它正在响应哪个请求。
基本上。。
无论何时没有javascript执行,都会检查从settimeout触发的事件和对XmlHttpRequest的响应。它们确实被添加到了事件队列中。
这样做的有趣效果是,只要javascript当前正在执行,就永远不会触发这样的事件。
XmlHttpRequest
的异步特性是在比javascript更低的级别上提供的(由浏览器提供)。回调函数由浏览器向javascript引擎发出请求已完成的信号来启动。