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