Javascript 同步xhr提供了对用户输入的本机处理进行排队的功能,是否还有其他替代方案?

Javascript 同步xhr提供了对用户输入的本机处理进行排队的功能,是否还有其他替代方案?,javascript,ajax,input,xmlhttprequest,synchronous,Javascript,Ajax,Input,Xmlhttprequest,Synchronous,近十年来,我一直看到关于使用同步XHR(XMLHttpRequest)的警告,甚至有人建议在出现错误时开始抛出错误。我理解人们为什么不喜欢它们(它们经常导致糟糕的用户体验),我也同意绝大多数请求都应该是异步的,但据我所知,它们提供了一个有用的用户体验特性,这是所有建议的替代方案都没有提供的:它们将用户的输入排队 如果我经常使用界面,并且我知道会发生什么,我不会等待视觉提示来继续输入,例如,如果我使用Windows,我想打开Chrome,我会键入[WindowsKey]Chr[Enter]。我不会

近十年来,我一直看到关于使用同步XHR(XMLHttpRequest)的警告,甚至有人建议在出现错误时开始抛出错误。我理解人们为什么不喜欢它们(它们经常导致糟糕的用户体验),我也同意绝大多数请求都应该是异步的,但据我所知,它们提供了一个有用的用户体验特性,这是所有建议的替代方案都没有提供的:它们将用户的输入排队

如果我经常使用界面,并且我知道会发生什么,我不会等待视觉提示来继续输入,例如,如果我使用Windows,我想打开Chrome,我会键入
[WindowsKey]Chr[Enter]
。我不会等待“开始”菜单出现,因为我知道所有输入都将排队并播放

我在所有与我交互的OSs(操作系统)和UI(用户界面)中都发现了这种行为,但在我使用的任何基于web的UI中似乎都没有这种行为。我在Thunderbird中启动了一个新的电子邮件,开始打字时没有问题,但是如果我在Gmail中也这样做,我发现电子邮件地址的前几个字符丢失了,因为在我开始打字时对话框还没有打开。这似乎是异步输入处理导致的错误用户体验

这个问题的普遍性并没有让我充满希望,但有没有任何建议的机制来处理这个问题

在一组有限的用例之外,我所能想到的这两个是不太可能的:

  • 将所有内容移动到客户端。这本质上意味着通过将UI更改的所有逻辑移动到客户端,从而可以同步执行请求,从而完全避免请求
  • 实现javascript事件队列并尝试重新实现用户输入的所有本机行为。我认为这可能很痛苦,但对于我给出的用例来说是可行的,但是如果我不得不开始考虑操作系统特定的键盘快捷键,那将是一场噩梦

  • 你确实提出了一个很好的观点。由于内容不存在而删除的“错过”击键和其他事件可能会很烦人。我是大多数应用程序的超级用户,只要有可能,我都会尝试使用快捷方式。我知道,如果你知道只需要按一系列键就可以到达你想要的地方,而在发出命令之前,你必须等待一个窗口/菜单出现,这会是多么烦人。不过,这在网站上更为罕见。我想还有其他选择,但不是很好:重新实现这个功能。触发一个异步事件,并可能尝试存储来自用户的所有事件,然后在请求返回后重播它们。不过,这可能会很奇怪,尤其是当请求需要更长时间时。如果您希望在等待时允许某些事件,则会变得更加复杂,例如用户在等待时单击某个位置。如果您抛出一个“加载屏幕”,并且在请求返回之前不允许交互,那么复杂性可能会有所降低。但它也不是完美的。理想情况下,即使等待请求,您也希望能够立即对交互进行操作。这并不总是可能的,因为您可能需要在知道要做什么之前获取数据。在某些情况下,您可以尝试预加载数据(或可能的数据)以平滑用户交互。所以,页面加载完毕,准备好了,您可以静默地对现在不需要的数据进行后台请求,但如果用户打开某个菜单,则可能需要这些数据。举个例子,假设一个按钮打开了一个包含数据和一些过滤器的网格-过滤器和数据都依赖于按下按钮之前屏幕的状态。因此,您不能预取数据,因为这可能会很昂贵,但您可以获取可能的筛选器值,因此用户按下按钮,您可以显示带有一些筛选器的屏幕,然后等待数据。当filters+数据返回时,如果存在差异,请用实际值悄悄地替换现有的筛选器。但在很多情况下,很难成功。它还可以使客户机与服务器之间非常健谈。一些本地缓存可能会有所帮助,您可能需要确保设计是一致的,这样您就可以缓存很多类似的东西。