我想知道JavaScript回调是如何工作的。我特别无法理解异步XmlHttpRequest
的工作原理。 JS如何确定服务器返回一些值(在一个线程中),以及何时调用回调方法?它是建立在计时器上的吗?
答案 0 :(得分:2)
更详细地回答了一个非常类似的问题here。
基本答案是底层网络发生在操作系统级别,当传入的网络数据包到达时,可能存在线程或某种类型的通知。结果完成后,会将事件添加到javascript事件队列中。当该事件到达事件队列的顶部并且javascript已准备好对其进行操作时,将触发正确的javascript ajax事件,该事件将启动导致调用您的回调的javascript链。
可能有一些计时器涉及超时,但定时器不习惯知道ajax响应何时到来。这是基于浏览器使用的操作系统级网络支持。
答案 1 :(得分:1)
你不会使用计时器,因为你无法确定它们何时应该触发。
我想它正在使用某种堆栈/队列[list或table]来跟踪调用并关闭响应函数,具体取决于返回的信息,告诉你它正在响应哪个请求。
答案 2 :(得分:1)
请记住,javascript在一个环境中运行。那个环境不是单线程的。当xhr返回浏览器(环境)时,通知javascript引擎xhr返回,然后它将执行回调。还要记住,即使用户的javascript编程模型是单线程的,javascript本身也不一定。
答案 3 :(得分:1)
基本上..
当目前没有javascript执行 时,会检查从settimeout触发的事件和对XmlHttpRequest的响应。它们确实被添加到事件队列中。
这个有趣的效果是,只要javascript 当前正在执行,就不会触发这些事件。
答案 4 :(得分:1)
XmlHttpRequest
的异步性质是在低于javascript(由浏览器)提供的。回调函数由浏览器向javascript引擎发出请求已完成的信号启动。