背景
我正在创建一个“地址簿”类型的应用程序。有很多条目需要加载。一个想法是首先加载一小部分条目,让用户开始,然后将剩余条目排队,优先考虑用户单击的条目。 (例如,如果他们单击以 X 开头的名称,请先加载这些名称,然后再处理队列的其余部分)。这个想法是在初始化时加载初始数据集(通过 AJAX),然后在后台加载其余数据(进行大量 AJAX 调用)。
我的许多问题
从概念上讲,我知道如何做到这一点,但我不清楚 Javascript 引擎的限制:
执行顺序是否依赖于浏览器?我尝试做的一件事是将条目集(A、B、C 等)排队,然后同时发出一大堆请求。这不是很成功。我接到了大部分电话,但没有按任何特定顺序。我需要所有的回电。 :)
我如何调试这个/跟踪这个?我不确定 Javascript 如何处理响应;对于单个响应来说很容易,但我不确定如何处理来自服务器的多个相对较大的响应。
给定页面是否有单个执行线程?也就是说,如果 Javascript 从服务器获得响应但仍在执行代码,那么事务是否会阻塞,直到当前执行的代码完成为止?
是否建议在请求之间设置延迟?这也可能会导致问题,因为请求的加载和发送(截至目前)处于初始化阶段;如果我必须在请求之间睡眠(),那么我不妨强制用户等待所有数据加载,而不尝试进行这种逐渐加载。
我环顾四周,但没有发现任何有用的东西。我很好奇 JS 如何处理这些异步请求/响应。
到目前为止我做了什么
为了让人们更好地了解正在发生的事情,以下是我按照执行顺序所做的事情。有 5 个硬编码搜索类别:名字、姓氏、类别、地区、州。每个类别都有范围。例如,名字类别可能有 26 个范围,每个范围对应字母表中的每个字母:“Aardvark - Azariah”就是一个范围的示例。每个范围都有该范围内每个用户的用户信息。我有两个表:范围表和用户表。
- 初始化范围表和范围数据源对象。将范围表对象映射到特定事件。
- AJAX 调用以获取每个类别的所有范围。我们等待这一点然后再继续。
- 与范围表类似地初始化用户表。
- 构建一个加载队列以获取每个范围的所有用户。加载队列如下所示:[lastNames['S']、states['CA']、regions['northwest']、lastNames['A'] 等]
- 预选择名字类别、“A”名字范围以及该范围中的第零个用户。 (这只是我为给用户一个起点而做出的任意选择)
- AJAX 调用以获取firstName['A'] 的所有用户。从加载队列中删除firstNames['A']范围。
- 填充适当的 UI 元素
- 循环我们的加载队列、使范围出列并构建数据的 AJAX 请求。
还有很多其他细节......但这就是它的基本要点。
发生的情况是,我的范围表填充得很好......但是浏览器只是阻塞(spod),然后我的用户表中填充了各种疯狂的数据。显然,后者是我的一个 UI 错误,所以我必须对此进行调查,但我不清楚这是最好的方法。
在第 7 步,我不确定请求之间是否应该有延迟。理想情况下,如果用户选择特定范围,例如状态['AK'],我们将首先处理该请求,从我们的加载队列中dq'ing该范围。但是,如果我在前端发送所有请求,那么我们将永远没有机会为我们选择的范围提供适当的优先级。
JavaScript 是完全单线程的。
如果您进行多个 AJAX 调用,您将在服务器发送后立即收到每个响应;顺序取决于服务器发送每个回复所需的时间。
如果服务器回复时您的代码仍在运行,则只有在您的代码完成后才会处理回复。
您应该尝试在单个请求中加载所有数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)