Javascript 在syncajax调用中未执行先前的语句
我有一个函数Javascript 在syncajax调用中未执行先前的语句,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,我有一个函数 function m1(){ $('.loader').show(); var xargs={ type : 'POST', url : resourceUrls["listUrl"], data : "sId="+sId, async:false, dataType : "text", success : OnGetJsonCallback,
function m1(){
$('.loader').show();
var xargs={
type : 'POST',
url : resourceUrls["listUrl"],
data : "sId="+sId,
async:false,
dataType : "text",
success : OnGetJsonCallback,
failure : function(response) {
$(".loader").hide();
}
};
$.ajax(xargs);
}
这里的问题是,在进行ajax调用之前,加载程序没有显示出来。如果我放置一个正在被记录的控制台日志语句
我做了一些搜索,了解到同步AJAX调用冻结了浏览器。但它可以显示加载程序,然后冻结浏览器,不是吗
我做了一些搜索,了解到同步AJAX调用
冻结浏览器。但它可以显示加载程序,然后冻结
是吗
我不同意这样做,但您可以先收听show complete,然后拨打同步电话:
$('.loader').show(500, m1);
function m1(){
var xargs={
type : 'POST',
url : resourceUrls["listUrl"],
data : "sId="+sId,
async:false,
dataType : "text",
success : OnGetJsonCallback,
failure : function(response) {
$(".loader").hide();
}
};
$.ajax(xargs);
}
我做了一些搜索,了解到同步AJAX调用
冻结浏览器。但它可以显示加载程序,然后冻结
是吗
我不同意这样做,但您可以先收听show complete,然后拨打同步电话:
$('.loader').show(500, m1);
function m1(){
var xargs={
type : 'POST',
url : resourceUrls["listUrl"],
data : "sId="+sId,
async:false,
dataType : "text",
success : OnGetJsonCallback,
failure : function(response) {
$(".loader").hide();
}
};
$.ajax(xargs);
}
Javascript是单线程的,这意味着如果调用堆栈上有任何内容,浏览器将无法调用绘制(并呈现加载程序的移动),因为呈现队列正在等待堆栈清除,因此加载程序仅在请求完成并弹出调用堆栈后才会移动 javascript的本质是异步的,因为您不应该为了能够响应用户交互而阻塞堆栈,这就是使用回调和异步方法的原因
function m1(){
$('.loader').show();
var xargs={
type : 'POST',
url : resourceUrls["listUrl"],
data : "sId="+sId,
async:false,
dataType : "text",
success : OnGetJsonCallback,
failure : function(response) {
$(".loader").hide();
}
};
setTimeout(function() {
$.ajax(xargs);
},0);
}
将sync ajax请求包装为超时的原因是允许浏览器在将请求放入堆栈并阻止所有内容之前进行绘制。Javascript是单线程的,这意味着如果调用堆栈上有任何内容,浏览器无法调用绘制(并呈现加载程序的移动)由于渲染队列正在等待堆栈清除,因此加载程序不会仅在请求完成并弹出调用堆栈后移动 javascript的本质是异步的,因为您不应该为了能够响应用户交互而阻塞堆栈,这就是使用回调和异步方法的原因
function m1(){
$('.loader').show();
var xargs={
type : 'POST',
url : resourceUrls["listUrl"],
data : "sId="+sId,
async:false,
dataType : "text",
success : OnGetJsonCallback,
failure : function(response) {
$(".loader").hide();
}
};
setTimeout(function() {
$.ajax(xargs);
},0);
}
将sync ajax请求包装为超时的原因是,允许浏览器在将请求放入堆栈并阻止所有内容之前进行绘制。主线程上的同步XMLHttpRequest因其对最终用户体验的有害影响而被弃用。如需更多帮助,请查看
因此,不使用同步请求,您可以通过在您的网页中实现UI阻止程序来使用异步请求获得相同的结果。只需在更高的位置放置一个全宽和全高的div。并且它不会冻结加载元素。主线程上的同步XMLHttpRequest被弃用,因为它会对最终用户的体验产生有害影响。如需更多帮助,请查看
因此,不使用同步请求,您可以通过在您的网页中实现UI阻止程序来使用异步请求获得相同的结果。只需在更高的位置放置一个全宽和全高的div。而且它不会冻结加载元素。不要使用同步ajax调用!!不幸的是,我在这里需要它。为什么需要使用sync而不是async?
。show()
是一个异步函数。syncajax(矛盾修饰法)在它结束之前阻止了它。正如@nordyguy所指出的,我只是courioius为什么需要Sync调用?如果您告诉我们,我们可能会建议您避免使用它的答案。不要使用同步ajax调用!!不幸的是,我在这里需要它。为什么需要使用sync而不是async?。show()
是一个异步函数。syncajax(矛盾修饰法)在它结束之前阻止了它。正如@nordyguy所指出的,我只是courioius为什么需要Sync调用?如果你告诉我们,我们可能会建议你一个答案,以避免使用它。不,一旦节目完成,它被称为。此构造函数需要持续时间,并在show完成后启动回调函数。不,它在show完成后调用。此构造函数持续时间,并在show完成后启动回调函数。