async:false弃用,前进的简单方法是什么?

时间:2018-01-18 13:31:09

标签: javascript jquery ajax asynchronous xmlhttprequest

浏览器根据同步XMLHttpRequest的whatwg规范警告。从警告中,弃用的原因很明显“用户体验”

我的问题是:

  1. 这有什么简单的替代品?他们不能更新JS吗? 它不会停止浏览器中的所有其他JS代码,只是 正在运行的线程中的一个?
  2. 这是相关的,因为有几次我们需要使用async:false。这不需要任何“复杂”方法,如数据绑定,Deffering甚至在.done().fail()方法中放置代码。 (使用Jquery时。)

    1. 开发人员不应该担心“用户体验” 他自己的用户超过这些标准强加给谁?
    2. Firefox抛出的警告:

        

      主线程上的同步XMLHttpRequest因不推荐使用   它对最终用户的体验产生不利影响。获得更多帮助   http://xhr.spec.whatwg.org/

      代码段( JQuery )生成警告的示例:

      $.ajax({
        url: url,
        type: "GET",
        data: {},
        async: false,
        success: function(data) {
            //Do something
        },
      
        error: function(xhr, status, error) {
          //Throw error message
      
        }
      });
      
      //Wait for $.ajax to finish execution the continue ...

2 个答案:

答案 0 :(得分:0)

同步方式可用于动态加载外部.js文件。如果使用imbricated回调,必须加载3或4个外部模块会引发回调地狱。相反,你可以像往常一样在加载你的html页面时,然后我们不关心用户体验" ?使用模块加载器会有什么帮助吗?

答案 1 :(得分:0)

好吧,我假设您需要使用它来加载此文件或数据,例如,当用户单击某些内容时要使用。这样您就可以这样做;

 var lol = {};
 var dataOutSide = null;
 var xhr = new XMLHttpRequest();

xhr.responseType = 'json';
xhr.open('GET', 'https://api.nasa.gov/planetary/apod?api_key=NNKOjkoul8n1CH18TWA9gwngW1s1SmjESPjNoUFo');
xhr.onload = function (e) {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log(xhr.response); // use this to build if you need show this data when the page is loaded
      dataOutSide = xhr.response; // use this to  if you need show this data anytime after the page is loaded

    } else {
      console.error('big fail! :(');
    }
  }
};
xhr.send(); // and then you put you listeners like clicks inside  $(document).ready(function ....

	 $(document).ready(function(){

$('#my-btn').click(function (event){ 
console.log(dataOutSide); // all stuff 
$('body > div').append('<img src="'+dataOutSide.url+'" />') }); // when i click my btn show me the image ;

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<head>
	<title></title>

</head>
<body>
       <div>
	     <button id="my-btn">show me ! </button>
        </div>
</body>