同步XHR(AJAX)已弃用?

时间:2016-09-19 06:51:17

标签: javascript php ajax caching

我在我的网站上设置了一个翻译系统(由你真正开发),这基本上是一些返回数组的php文件。

hello.php     

return [
  'world' => 'Hello, world!'
];

通过课程轻松访问

Lang::get('hello', 'world'); // Hello, world!

在构建响应时,这一切都很好,但是在某些情况下我需要在没有请求的情况下显示翻译。例如,我已经制作了另一个方便的功能,我在表单上进行了PHP验证,并且我自动生成了JavaScript规则,在发送请求之前在页面上执行相同的验证,如果验证失败,那么我需要显示相应的消息 - 验证失败可能有数百种可能的原因。请注意,这只是一个示例用例,因此我看到的解决方案是:

  • 我可以使用初始请求加载翻译字符串的所有,并准备好显示其中任何一个。这将浪费大量带宽,因为大多数时候大多数字符串根本不需要。我可以更进一步,将它们缓存在本地存储中,但缓存整个网站的文本内容(可翻译)可能超过允许的存储量,因此这似乎不太可靠。

    < / LI>
  • 我无论如何都可以发送请求并检索我需要的翻译,在示例用例中破坏了进行此类验证的全部要点,但是比前一个更好的解决方案,此外如果做得对我可以从浏览器的内部缓存中获益,该缓存只会请求翻译一次并在后续请求中从缓存加载它们,这听起来不错。

我已选择使用第二种解决方案而我遇到的问题是:

我有一个JavaScript功能,我将在伪代码中描述。

function translate(file, key) {
  if(!storage[file]) {
    storage[file] = sendAjaxAndLoadFileFromServer();
  }

  return storage[file][key];
}

var storage = {};

如果浏览器缓存了请求,我不知道是否需要在页面上进行二次缓存,但这似乎不会造成损害?我也可以对此发表意见。

现在这可行,因为我正在同步发送AJAX请求。但是我在控制台中看到了这条消息:

  

主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用。如需更多帮助http://xhr.spec.whatwg.org/

继续suggested site我没有看到任何暗示我不应该使用同步请求的内容,但是此消息中的弃用一词让我思考。

不幸的是,这是我实现此解决方案的唯一方法(通过同步请求),因为此函数是在需要返回值的地方调用的,例如

new Dialog(translate('world'));

我不知道如何在这种情况下实施承诺或任何事情。

所以问题是:

我可以使用同步AJAX请求,它们会在不久的将来消失吗?

2 个答案:

答案 0 :(得分:0)

恕我直言,没有什么可担心的。它已被弃用,因为它会影响UI(冻结),但它是AJAX的一个功能。但也许你可以做异步方式 - 显示等待覆盖,收集所有未翻译的消息,然后隐藏覆盖,然后显示你需要的消息。

根据评论,也许有一种方法:

也许你可以立即让翻译返回但是回调。每次调用翻译队列字符串进行翻译并显示&#34;等待&#34;。在回调中,您将获得翻译后的字符串。

将会有另一个过程 - 翻译。如果queue不为空,它将定期转换排队的字符串(例如每隔10ms),并为每个字符串调用注册的回调。处理后如果队列为空,则隐藏&#34;等待&#34;。

效果将是 - 首次请求翻译节目&#34;等待&#34;最后一次请求隐藏了它。所有翻译都是分开的,但是分批提供。您需要做的是将字符串替换逻辑移动到回调函数。

答案 1 :(得分:0)

这将是一个由两部分组成的答案,因为您的问题是打开两个单独的主题。

同步AJAX

它被推荐是有充分理由的。如果您执行同步ajax请求,整个网站会在请求期间冻结。当互联网连接速度很快且服务器迅速响应时,这只需要几毫秒。但是,如果浏览器必须等待更长时间才能响应,网站可能会冻结几秒钟,这可能会让用户感到沮丧。这就是应该避免同步ajax请求的原因。

错误消息的翻译

您可能需要考虑以下几个选项:

  • 按语言分段翻译文件。始终仅为活动语言加载文本。如果您支持语言,则只加载所有文本的1/5。
  • 按表单或页面或其他相关翻译消息分组对翻译文件进行分段。然后在显示表单之前加载特定于该表单的翻译。这将进一步减少不必要的消息的加载。

请求持续时间= ping +响应大小/连接速度

(对于静态文件) Ping是将请求发送到服务器并获取第一个字节所花费的时间。它需要1毫秒的光纤,并且可以在移动设备上花费几百毫秒的时间。在具有100ms ping和100kB / s带宽的3G连接上,以下两者都需要200ms:

  • 加载10kB数据(ping 100ms +传输100ms = 200ms)
  • 发送两个请求,每个请求几乎不传输数据(ping 100ms + ping 100ms = 200ms)

因此,选择一次加载多个消息的翻译解决方案可能是完全可以接受的,因为您可以避免因服务器和客户端之间的ping而浪费时间。