Javascript 异步还是不异步ajax请求?什么时候可以使用async=false?

Javascript 异步还是不异步ajax请求?什么时候可以使用async=false?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,据我所知,在ajax请求上读取许多帖子的方法都是async=false,这并不是处理ajax请求的真正方法。但是,有没有一种方法可以让我知道它们之间的区别——决定使用哪一种还是始终使用异步 我目前在理解ajax和使用回调的ajax以及何时使用回调方面面临着挑战。我在这里有一个按钮,我可以点击它,这样我就可以看到grialicioushttp://suprb.com/apps/gridalicious/将我需要的项目附加到我的网格div容器中。但是,ajax请求总是在返回我的项目后运行。所以我现在

据我所知,在ajax请求上读取许多帖子的方法都是async=false,这并不是处理ajax请求的真正方法。但是,有没有一种方法可以让我知道它们之间的区别——决定使用哪一种还是始终使用异步

我目前在理解ajax和使用回调的ajax以及何时使用回调方面面临着挑战。我在这里有一个按钮,我可以点击它,这样我就可以看到grialicious
http://suprb.com/apps/gridalicious/
将我需要的项目附加到我的网格div容器中。但是,ajax请求总是在返回我的项目后运行。所以我现在唯一的方法就是执行
request.async=false
使其同步工作。但这种方法正确吗?还是有更好的方法来重构我的代码

$('#loadMoreButton').click(function(){
  var $grid = $('#my-grid').gridalicious('append',loadMoreUserFeed());
})


function loadMoreUserFeed(){

  var loadMoreButton = $('#loadMoreButton')
  var items = new Array;

  var request = {

    success: function(response){
      $.each(response.results.items,function(){

        myitem = document.createElement('div');
        myitem.className = 'my-item';

        items.push(myitem)

      }
    },
    error: function(response){
      debugger;
    }
  }

  request.dataType= 'json';
  request.contentType = 'application/json';
  request.data = $(this).serialize();
  request.scriptCharset = "utf-8";
  request.url = '/my_url';
  request.type = "GET";
  request.async = true;

  $.ajax(request);

  return items;

}
当我使用
request.async=false
时,我收到以下消息。但是当我执行
request.async=true
时,在我的请求完成之前,一个空数组将在我的项目列表之前返回到gridalicious

主线程上的同步XMLHttpRequest已被弃用,因为它会对最终用户的体验产生有害影响。

异步还是不异步ajax请求?什么时候可以使用async=false?如果选择保持异步。我应该如何构造ajax的执行

编辑

以下是我为使async=true能够工作而提出的一个建议更改:

$('#loadMoreButton').click(function(){

  loadMoreUserFeed()

})


function loadMoreUserFeed(){

  var loadMoreButton = $('#loadMoreButton')
  var items = new Array;

  var request = {

    success: function(response){
      $.each(response.results.items,function(){

        myitem = document.createElement('div');
        myitem.className = 'my-item';

        items.push(myitem)

      }
      $('#my-grid').gridalicious('append',items);
    },
    error: function(response){
      debugger;
    }
  }

  request.dataType= 'json';
  request.contentType = 'application/json';
  request.data = $(this).serialize();
  request.scriptCharset = "utf-8";
  request.url = '/my_url';
  request.type = "GET";
  request.async = true;

  $.ajax(request);

}
但我不知道这是否是最好的办法

编辑2

$('#loadMoreButton').click(function(){

  loadMoreUserFeed(makeDivItems)

})


function loadMoreUserFeed(callback){

  var request = {

    success: function(response){
      callback()
    },
    error: function(response){
      debugger;
    }
  }

  request.dataType= 'json';
  request.contentType = 'application/json';
  request.data = $(this).serialize();
  request.scriptCharset = "utf-8";
  request.url = '/my_url';
  request.type = "GET";
  request.async = true;

  $.ajax(request);

}


function makeDivItems(){

  var items = new Array;

  $.each(response.results.items,function(){

    myitem = document.createElement('div');
    myitem.className = 'my-item';

    items.push(myitem)

  }
  $('#my-grid').gridalicious('append',items);
}

根据警告,“何时可以接受使用async=false”-最好避免。浏览器可能已经尝试抛出错误而不是显示警告,因此它可能(至少在理论上)随时停止工作。如果你坚持使用异步请求,那么你的问题就是这个问题的翻版:我只能想一个在页面卸载而请求无法完成时使用同步的好方法。James在那里提供了一个很好的链接。@JamesThorpe我添加了一个建议的修复。但我不确定这是否是最好的方法。请让我知道您的想法。@user805981虽然您的修复可能有效,但我会使用另一个问题中记录的回调方法。现在,您的
loadMoreUserFeed
函数做得太多了——例如,它不需要知道
“#我的网格”
,而是通过回调函数将结果传回知道它的函数。无论异步模型在何处不起作用,这可能是在使用某些遗留内容或某些浏览器功能时。例如,我有一个项目,其中用户在查看页面时锁定了资源,在导航离开或关闭时解锁了资源,最后我们不得不同步解锁请求,使其在
onbeforeuload
中工作。最终,我们将不得不重新设计整个功能以避免出现这种情况,但我们目前仍在使用它。