Javascript进程是否有多个执行线程?

时间:2010-12-19 16:20:10

标签: javascript ajax

背景

我正在创建一个'地址簿'类型的应用程序。有很多条目要加载。一个想法是最初加载一小部分条目,以启动用户,然后排队剩余的条目,优先考虑用户点击的条目。 (例如,如果他们点击以X开头的名称,则在处理队列的其余部分之前先加载这些名称)。我们的想法是在初始化时(通过AJAX)加载初始数据集,然后在后台加载其余的数据集(进行大量的AJAX调用)。

我的很多问题

从概念上讲,我知道如何做到这一点,但我不清楚Javascript引擎的局限性:

  1. 执行浏览器的顺序是否依赖?我尝试做的其中一件事就是排队一组条目(A,B,C等),然后同时发出一大堆请求。这不是很成功。我收回了大部分电话,但没有按任何特定顺序。我需要回复所有电话。 :)

  2. 如何调试/跟踪此信息?我不确定Javascript如何处理响应;单个响应很容易,但我不确定如何处理来自服务器的多个相对较大的响应。

  3. 给定页面是否有单个执行线程?也就是说,如果Javascript从服务器获得响应但仍在执行代码,那么事务是否会阻塞,直到当前正在执行的代码完成?

  4. 是否建议在请求之间延迟?这也可能导致问题,因为加载和发送请求(截至目前)处于初始化阶段;如果我必须在请求之间睡觉(),那么我不妨强迫用户等待加载所有数据而不试图逐步加载。

  5. 我环顾四周但是没有找到任何有用的东西。我很好奇JS如何处理这些异步请求/响应。

    到目前为止我做了什么

    只是为了让人们更好地了解正在发生的事情,这就是我在执行顺序中所做的事情。有5种硬编码搜索类别:名字,姓氏,类别,地区,州。这些类别中的每一个都有范围。例如,名字类别可能有26个范围,每个字母对应一个字母:“Aardvark - Azariah”将是一个范围的示例。每个范围都包含该范围内每个用户的用户信息。我有两个表:范围表和用户表。

    1. 初始化范围表和范围数据源对象。将范围表对象映射到特定事件。
    2. AJAX调用以获取每个类别的所有范围。我们在继续之前等待这一点。
    3. 与范围表类似地初始化用户表。
    4. 构建加载队列以获取每个范围的所有用户。加载队列如下所示:[lastNames ['S'],states ['CA'],regions ['northwest'],lastNames ['A']等]
    5. 预先选择名字类别,'A'名字范围和该范围内的零用户。 (这只是我为用户提供一个起点的任意选择)
    6. AJAX调用以获取firstName ['A']的所有用户。从加载队列中删除firstNames ['A']范围。
    7. 填充相应的UI元素
    8. 遍历我们的加载队列,出列范围并构造数据的AJAX请求。
    9. 还有很多其他细节......但这是它的基本要点。

      我的范围表填充得很好...但是浏览器只是阻塞(spod)然后我的users表会在其中填充各种疯狂的数据。显然后者是我的UI漏洞,所以我必须对此进行调查,但我不清楚这是最好的方法。

      在第7步,我不确定请求之间是否应该有延迟。理想情况下,如果用户选择了特定范围,比如说州['AK'],我们首先处理该请求,从我们的加载队列中调整该范围。但如果我在前端发送所有请求,那么我们永远不会有机会给我们选择的范围提供适当的优先级。

4 个答案:

答案 0 :(得分:8)

Javascript完全是单线程的。

如果您进行多次AJAX调用,您将在服务器发送后立即收到每个响应;订单取决于服务器发送每个回复所花费的时间。

如果您的代码在服务器回复时仍在运行,则只有在代码完成后才会处理回复。

您应该尝试在单个请求中加载所有数据。

答案 1 :(得分:1)

  

是执行浏览器的顺序       依赖?我试过的一件事       要做的就是排队       条目(A,B,C等)和       然后提出一大堆请求       一次全部。这不是很好       成功的。我收到了大部分电话       回来了,但没有任何特别的       订购。我需要回复所有电话。

执行顺序与浏览器无关。他们是事件驱动的,事件取决于你。当你说“队列”时,混合中没有消息队列;你的意思是服务器用于获取这些内容并将它们分配给线程的任何机制。

通话的返回时间取决于完成通话所需的时间。您的浏览器和服务器之间存在非确定性网络,因此您无法分辨。

  

如何调试/跟踪此信息?我       不确定Javascript如何处理       响应;这很容易       单一回应,但我不确定       如何处理多个,相对而言       来自服务器的大量回复。

谷歌Chrome有一些非常好的调试工具,由Apple捐赠并开源。看看那些。或者你可以试试Firefox Firebug。

  

是否有一个执行线程   对于给定的页面?也就是说,如果   Javascript得到了回复   服务器,但仍在执行代码,   交易阻止,直到   目前正在执行代码完成?

JavaScript是单线程的。

  

是否建议加入   请求之间的延迟?这可以   因为这也会引起问题   加载和发送请求   (截至目前)正处于初始化阶段   相;如果我必须睡觉()之间   请求,然后我也可以   强迫用户等待全部   加载数据而不尝试这样做   逐渐加载。

我不会在请求之间延迟。我认为这违背了目的。

我建议查看jQuery来帮助解决这个问题。

答案 2 :(得分:1)

Ajax代表“异步JavaScript和XML”。 “异步”意味着无法在请求时知道响应将以何种顺序到达。

JavaScript(目前)没有线程机制,所以你有两种可能性:

  1. 在最后一部分到达后请求下一部分。这可能非常缓慢且效率低下,因为一个挂起请求将阻止所有其他请求。
  2. 为所有可能的请求创建一个列表/数组,并开始加载重要的请求。如果用户想要其他东西,也可以开始加载其余的东西。将响应存储在数组中的正确位置;这将使您的脚本与顺序无关,您可以通过简单地循环遍历数组来检查是否所有内容都已存在。

答案 3 :(得分:0)

JavaScript是一种优化的编程语言,这就是为什么你会看到很多这种模式的原因:

someFunction(arguments, callbackFunction () {
  // code fired after a process or event is fired
});

我没有得到您的请求的所有回复,您的实施或您正在查询的资源有问题。您可以使用Firebug来深入了解正在发生的事情。

您是否正在使用任何JavaScript框架,他们非常容易地使用XHR请求(a.k.a. Ajax)。我推荐jQuery。