【发布时间】:2015-09-07 19:22:09
【问题描述】:
我的浏览器(或者更具体地说是 JQuery 框架)向浏览器的控制台打印以下警告:
主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看http://xhr.spec.whatwg.org/。
我理解警告,但不明白它出现的原因。据我了解, asyncFunct() 的调用 是 异步的,因此不应打印警告消息。
我正在使用这个 JavaScript 代码:
var i18nObject;
$(document).ready(function () {
// execute asyncFunct() asynchronously
setTimeout(asyncFunct, 3000);
});
function asyncFunct() {
alert(i18n("rejoin.title"));
}
function i18n(key) {
if (typeof i18nObject == 'undefined') {
// i18n not loaded yet, need to load it first
$.ajax({
url: 'UrlTo/i18n.json',
async: false,
dataType: 'json',
success: function (response) {
i18nObject = response;
}
});
}
if (i18nObject.hasOwnProperty(key)) {
// key found
return i18nObject[key];
} else {
// key not found
return key;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
面对一些关于async: false 的担忧(来自 cmets):这是故意选择的,因为我需要函数返回一个值。我知道如果他们锁定 UI,使用同步调用是个坏主意。但是为什么这适用于我的问题呢?我希望对 asyncFunct() 的调用是异步的。
为什么我会收到此警告,是否可以禁用它? (以防止控制台中出现不必要的文本)
【问题讨论】:
-
它明确告诉你不要使用
async: false,,这首先是一种糟糕的做法。在成功回调中处理您的响应。见how-to-return-the-response-from-an-asynchronous-call -
该警告表明如果你想使用
async: false,你应该在主线程之外进行。看看使用Web workers。 -
我现在通过将 i18n() 调用移动到另一个 AJAX 调用的完成函数中来解决这个问题。这对我的特定问题很有用(因为无论如何我都需要拨打电话),但我仍然对为什么首先显示此消息感兴趣。
-
@charlietfl 感谢您的链接。在我的情况下,如果 i18nObject 之前没有加载,i18n() 函数应该只执行 AJAX 调用。有没有办法在不进行不必要的 AJAX 调用的情况下返回它(或返回“稍后再给我打电话,我仍在获取价值”)?
-
谷歌错误的完整解释
标签: javascript jquery ajax asynchronous