0

我的背景主要是作为服务器开发人员和经理,但我必须进入并从事前端和 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 的多线程概念(或者更准确地说是 POSIX 的带有 pthread_create 处理套接字描述符的 while 循环的概念)根本不同。

我可能只是没有得到任何东西,但我认为提供的大多数示例都没有说明这是如何在单线程环境中实际完成的(除非在操作系统级别而不是 Javascript 运行时级别考虑网络请求)

thx 对此有任何帮助

4

2 回答 2

1

考虑阅读这个 SO:非阻塞 IO 如何在 javascript 中工作

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

于 2013-08-20T18:47:28.630 回答
0

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

于 2013-08-20T18:40:12.190 回答