当浏览器javascript引擎是单线程时,如何以异步方式处理网络请求

时间:2013-08-20 18:31:44

标签: javascript jquery design-patterns asynchronous

我的背景主要是作为服务器开发人员和经理,但我必须进入前端和iOS开发工作。我问这个问题不是争论,但我真的没有得到Javascript在网络请求方面的单线程性质。

我了解事件如何在用户空间级别在Javascript和iOS中注册。我的问题是,如果网络请求没有放在后台线程上,iOS中的UI将会阻止。但是,在浏览器/ javascript运行时,它不会。 Javascript(至少是当前的实现/ pre-web-workers)总是被描述为单线程。我理解(我认为 - 但这可能是问题)setInterval用于检查完成的方式但是单线程Javascript运行时如何具有不阻止UI的异步函数(特别是考虑到iOS没有它)?例如,在这个答案中,似乎需要创建5个线程:Parallel asynchronous Ajax requests using jQuery

实际上,一次可以有6个出站网络请求。当javascript运行时被描述为单线程时,这是否意味着与多线程的iOS概念根本不同(或者更准确地说是使用pthread_create处理套接字描述符的while循环的POSIX概念)。

我可能只是没有得到一些东西,但我认为提供的大部分示例都没有了解在单线程环境中实际完成的方式(除非在操作系统级别而不是Javascript运行时考虑网络请求)电平)

thx对此有任何帮助

2 个答案:

答案 0 :(得分:1)

考虑阅读此SO:How does non blocking IO work in javascript

它提到的是javascript是基于事件循环的,这意味着当你构建一个asynchronus http-request时。它将执行ajax调用,注册eventlistener(执行回调方法),然后继续执行其排队的其余工作。 当响应返回时,侦听器将触发您已注册的回调方法。

答案 1 :(得分:0)

在Web应用程序的编程模型中,不会抢占执行以允许其他线程运行。您的webapp的一个主题运行,直到它产生,通过返回其原点或发出一个i / o请求。假设您有一个点击监听器 - 它不会中断在您的应用程序中运行的其他代码;浏览器在其前面的所有事件都运行完毕后运行它。在浏览器应用程序中,您不需要序列化对数据的访问,因为在任何给定时间只有一个堆栈处于活动状态。心连心。