2012-01-12 75 views
1

我想知道JavaScript回调是如何工作的。我特别不明白异步XmlHttpRequest是如何工作的。 JS如何确定服务器返回了一些值(在一个线程中)以及何时调用回调方法?它是否建立在定时器上?JS如何确定何时调用回调函数?

+0

关闭此副本:http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-the-background/7575649#7575649 – jfriend00 2012-01-12 17:28:31

回答

2

一个非常类似的问题在详细回答here

最基本的答案是,下层的联网是在OS水平,可以有螺纹或某些类型的通知时传入的网络数据包到达发生。结果完成后,事件将添加到javascript事件队列中。当该事件到达事件队列的顶部并且javascript已准备好对其执行操作时,将触发正确的javascript ajax事件,该事件将启动JavaScript链的结果调用您的回调。

有一些可能涉及的计时器超时的,但计时器没有用来了解什么时候Ajax响应已经到来。这基于浏览器使用的操作系统级网络支持。

+0

谢谢你的回答很简单,但是这个事件是在操作系统级别注册的(在操作系统notificate JS事件队列之前)?它们是在线程中注册的,它在浏览器的新页面打开后运行? – MyTitle 2012-01-12 17:57:45

+0

@你好 - 抱歉,我不明白你的问题。 JavaScript引擎在本机操作系统级代码中实现。在实施中可以使用全系列的OS级功能进行网络连接。它可以使用阻塞线程,套接字通知等... – jfriend00 2012-01-12 18:00:14

+0

您在其他问题中回答:“当ajax响应完成时,一些本机代码将知道它已完成并将事件放入JS队列中。”但是,本地代码保存有关此注册事件的信息? – MyTitle 2012-01-12 18:06:49

1

你不会使用计时器,因为你无法确定何时应该触发。

我可以想象它正在使用某种堆栈/队列[列表或表格]来跟踪调用并弹出响应函数,这取决于返回的信息,告诉您它正在响应哪个请求。

1

请记住,JavaScript运行在一个环境中。该环境不是单线程的。当xhr返回浏览器(环境)通知javascript引擎xhr返回时,它又会执行回调。还要记住,尽管用户的javascript编程模型是单线程的,但JavaScript本身并不是必须的。

+0

谢谢。但是,如何理解这一点:“尽管用户的javascript编程模型是单线程的,但JavaScript本身并不是必须的。” JS本身是如何多方面的?如果它本质上是单线程 – MyTitle 2012-01-12 17:17:39

+0

有2个部分给JavaScript。你使用的部分,它不会暴露线程。然后是JavaScript解释器,它运行你的代码。该部分可以穿线。 – hvgotcodes 2012-01-12 17:19:39

1

基本上..

每当有没有JavaScript的此刻执行,从setTimeout和响应,以触发事件的XmlHttpRequest检查。它们确实被添加到事件队列中。

这个有趣的效果是,只要javascript是目前执行,像这些事件将永远不会被触发。

1

XmlHttpRequest的异步特性在比JavaScript的较低的水平(由浏览器)被提供。回调函数由浏览器向javascript引擎发出请求已完成的信号启动。

+0

hm ...换句话说,这个事件(xhr回调函数,定时器回调函数,鼠标监听器等)被包含在浏览器的队列和浏览器信号中,以便JS引擎发生某些事件? – MyTitle 2012-01-12 17:34:24