我的浏览器(或更具体的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
的一些问题(来自评论):这是故意选择的,因为我需要函数来返回值。我知道如果他们锁定UI,使用同步调用是一个坏主意。但为什么这适用于我的问题呢?我希望对asyncFunct()的调用是异步的。
为什么我收到此警告,是否可以禁用它? (防止在控制台中出现不必要的文字)
答案 0 :(得分:1)
实际上,由于您将同步调用置于超时内,因此正如您正确指出的那样,看起来调用 异步发生(请参阅this jsbin示例):
setTimeout(function() {
$.ajax({
method: 'GET',
url: 'http://api.openweathermap.org/data/2.5/weather?q=London,uk',
success: function(res) {
console.log(res);
},
async: false
});
}, 1000);
console.log('something synchronous');
如果你打开控制台,你会注意到(正如预期的那样),首先记录something synchronous
,然后稍后一秒钟,记录我们API的结果。
所以我觉得这个问题有两个部分需要解决。
第一部分是,为什么你要使用弃用的API强制同步调用发生异步,当你可以完全避免超时并简单地让你的XMLHttpRequest自然异步?
第二部分是关于抑制警告。警告似乎错误地发生,但警告并未查看您在超时内发出同步请求的事实。它只是在考虑您使用的是不推荐使用的API这一事实。换句话说,警告仅关注已弃用的API本身的使用,而不关心具体实现。
但是,如果你真的想要取消这些警告,那么这将是一个全有或全无的交易(例如,参见this answer):
// define this as an empty function in your own code
console.log = function() {};
据我了解,asyncFunct()的调用是异步的,因此不应该打印警告信息。
假。
您的电话不是异步的。它是同步的,因为你有async: false
。
此警告是因为同步请求阻止主线程(例如,处理UI的同一线程)。这可能会破坏用户使用网站/应用的体验。因此,警告显示在控制台中。