2015-09-07 99 views
-1

我的浏览器(或jQuery框架,更具体)打印以下警告到浏览器的控制台:接收异步函数警告有关同步的XMLHttpRequest

在主线程同步的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:这是刻意选择,因为我需要的函数返回一个值。我明白如果他们锁定用户界面,使用同步调用是一个坏主意。但为什么这适用于我的问题呢?我希望对asyncFunct()的调用是异步的。

为什么我收到此警告,并且可以禁用它? (防止在控制台不必要的文本)

+3

它清楚地告诉你不要使用'async:false',这首先是一种可怕的做法。在成功回调中处理您的回复。请参阅[如何返回异步调用的响应](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call ) – charlietfl

+0

这个警告表明,如果你想使用'async:false',你应该在主线程之外执行它。看看使用[Web工作者](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)。 – Amit

+0

我现在通过在另一个AJAX调用的完成函数中移动i18n()调用来修复此问题。这对我的具体问题非常有用(因为我需要进行调用),但我仍然感兴趣为什么此消息显示在第一位。 – Nijin22

回答

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结果登录。

所以我觉得这个问题有两个部分需要解决。

第一部分是,当您完全避免超时并简单地使您的XMLHttpRequest自然异步时,为什么使用不推荐的API强制进行同步调用发生异步?

第二部分是关于压制警告。看起来这个警告错误地发生了,但是这个警告并没有考虑到你在超时内发出了同步请求。这只是看你是否使用了不推荐的API。换句话说,警告只关心弃用的API本身的用法,而不关注具体的实现。

但是,如果你真的想抑制这些警告,这将是一个全有或全无的交易(见this answer为例):

// define this as an empty function in your own code 
console.log = function() {}; 

原来的答复

我的理解asyncFunct()的调用是异步的,因此不应该打印警告消息。

假。

您的电话是而不是异步。它是同步的,因为你有async: false

此警告是因为同步请求阻塞主线程(例如处理UI的同一线程)。这可能会破坏用户使用网站/应用的体验。因此,警告显示在控制台中。

+0

谢谢,这解释了警告,但你能解释为什么这个调用是同步的吗?我已阅读http://stackoverflow.com/a/7374037/3298787它(据我的理解)说:“调用一个函数与setTimeout()使它异步” – Nijin22

+0

@ Nijin22,看到我更新的答案。 –

+0

谢谢,这是一个很好的答案。我使用同步调用的原因是:我需要从json对象(服务器端,基于客户端'accept-language'生成的)加载已翻译的消息。我想避免对对象进行不必要的调用( - >将其缓存在“i18nObject”中)。为了简化这个过程,我为它指定了一个单一的函数:“i18n()” 我只需要这个函数,当我已经从主线程( - > asyncFunct())解除同步,我想避免过于复杂i18n()与回调函数 – Nijin22