我想知道JavaScript回调是如何工作的。我特别不明白异步XmlHttpRequest
是如何工作的。 JS如何确定服务器返回了一些值(在一个线程中)以及何时调用回调方法?它是否建立在定时器上?JS如何确定何时调用回调函数?
回答
一个非常类似的问题在详细回答here。
最基本的答案是,下层的联网是在OS水平,可以有螺纹或某些类型的通知时传入的网络数据包到达发生。结果完成后,事件将添加到javascript事件队列中。当该事件到达事件队列的顶部并且javascript已准备好对其执行操作时,将触发正确的javascript ajax事件,该事件将启动JavaScript链的结果调用您的回调。
有一些可能涉及的计时器超时的,但计时器没有用来了解什么时候Ajax响应已经到来。这基于浏览器使用的操作系统级网络支持。
谢谢你的回答很简单,但是这个事件是在操作系统级别注册的(在操作系统notificate JS事件队列之前)?它们是在线程中注册的,它在浏览器的新页面打开后运行? – MyTitle 2012-01-12 17:57:45
@你好 - 抱歉,我不明白你的问题。 JavaScript引擎在本机操作系统级代码中实现。在实施中可以使用全系列的OS级功能进行网络连接。它可以使用阻塞线程,套接字通知等... – jfriend00 2012-01-12 18:00:14
您在其他问题中回答:“当ajax响应完成时,一些本机代码将知道它已完成并将事件放入JS队列中。”但是,本地代码保存有关此注册事件的信息? – MyTitle 2012-01-12 18:06:49
你不会使用计时器,因为你无法确定何时应该触发。
我可以想象它正在使用某种堆栈/队列[列表或表格]来跟踪调用并弹出响应函数,这取决于返回的信息,告诉您它正在响应哪个请求。
请记住,JavaScript运行在一个环境中。该环境不是单线程的。当xhr返回浏览器(环境)通知javascript引擎xhr返回时,它又会执行回调。还要记住,尽管用户的javascript编程模型是单线程的,但JavaScript本身并不是必须的。
谢谢。但是,如何理解这一点:“尽管用户的javascript编程模型是单线程的,但JavaScript本身并不是必须的。” JS本身是如何多方面的?如果它本质上是单线程 – MyTitle 2012-01-12 17:17:39
有2个部分给JavaScript。你使用的部分,它不会暴露线程。然后是JavaScript解释器,它运行你的代码。该部分可以穿线。 – hvgotcodes 2012-01-12 17:19:39
基本上..
每当有没有JavaScript的此刻执行,从setTimeout和响应,以触发事件的XmlHttpRequest检查。它们确实被添加到事件队列中。
这个有趣的效果是,只要javascript是目前执行,像这些事件将永远不会被触发。
的XmlHttpRequest
的异步特性在比JavaScript的较低的水平(由浏览器)被提供。回调函数由浏览器向javascript引擎发出请求已完成的信号启动。
hm ...换句话说,这个事件(xhr回调函数,定时器回调函数,鼠标监听器等)被包含在浏览器的队列和浏览器信号中,以便JS引擎发生某些事件? – MyTitle 2012-01-12 17:34:24
- 1. JS回调函数
- 2. 如何在按回车键时调用js函数
- 3. 回调函数节点的回调js
- 4. 如何正确调用img onerror回调函数?
- 5. 如何使用.queue()正确链接自定义回调函数?
- 6. 如何使用onsubmit调用js函数
- 7. 如何在调用函数后正确返回主函数?
- 8. 如何编写自定义的回调函数的js
- 9. 如何JS绑定到外部科尔多瓦回调函数
- 10. 角的js回调函数$超时
- 11. JSON和JS回调函数
- 12. WebScriptObject JS函数回调
- 13. Sails js回调函数
- 14. jQuery回调加js函数
- 15. 如何从Java Applet调用JS函数?
- 16. 如何从PHP调用js函数?
- 17. 如何在HTML中调用JS函数
- 18. 如何确定/使用$(this)在js回调脚本
- 19. Typescript如何定义回调函数?
- 20. 如何为asp:HyperlinkField指定回调函数?
- 21. 如何 - 回调函数
- 22. jQuery:我如何知道我正在使用多个回调函数调用正确的回调函数?
- 23. JS:如何使用返回类型的回调函数来返回主被调用函数
- 24. 如何从一个回调函数调用其他回调函数
- 25. 调用js函数
- 26. JS函数调用
- 27. 如何调用回调函数中的继承函数
- 28. .filter()如何使回调函数调用另一个函数?
- 29. 我如何调用Ajax回调函数的JavaScript函数
- 30. 使用预定义函数时回调
关闭此副本:http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-the-background/7575649#7575649 – jfriend00 2012-01-12 17:28:31