【发布时间】:2017-01-26 18:40:31
【问题描述】:
我在我的网站上搭建了一个翻译系统(真的是你们开发的),基本上就是一些返回数组的php文件。
你好.php
return [
'world' => 'Hello, world!'
];
通过类轻松访问
Lang::get('hello', 'world'); // Hello, world!
在构建响应时这一切都很好,但是在某些情况下,我需要在没有请求的情况下显示翻译。例如,我制作了另一个方便的功能,在表单上进行 PHP 验证,并且在发送请求之前自动生成在页面上执行相同验证的 JavaScript 规则,如果验证失败,那么我需要显示适当的消息 -验证失败可能有数百个可能的原因。请注意,这只是一个示例用例,所以我看到的解决方案是:
我可以使用初始请求加载所有的翻译字符串,并准备好显示其中的任何一个。这将浪费大量带宽,因为大多数时候根本不需要这些字符串。我可以更进一步,将它们缓存在本地存储中,但是缓存整个站点的文本内容(可翻译)可能会超过允许的存储量,因此这似乎不太可靠。
无论如何我都可以发送一个请求并检索我需要的翻译,这在示例用例中破坏了进行此类验证的全部意义,但它比前一个解决方案更好,而且如果做得好我可以受益于浏览器的内部缓存,它只会请求翻译一次,并在后续请求中从缓存中加载它们,这听起来不错。
我选择了第二种解决方案,我面临的问题是:
我有一个 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 请求吗?它们会在不久的将来消失?
【问题讨论】:
标签: javascript php ajax caching