我们知道只有同步请求是使用$ .ajax完成的,并且选项为async:false 但我在Jquery手册中看到过“同步请求可能会暂时阻止浏览器 在请求处于活动状态时禁用任何操作“。我有一些问题,例如
我看到一些答案说要使用callback()How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?。 我该如何实现这个功能呢?
在下面的函数中如果请求失败或者响应没有返回我如何处理它。我的意思是我可以使用“错误:”或类似的东西。 如何有效地改进这个功能我的意思是使用回叫和错误处理。据说(我们永远不会有错误和成功回复请求)
function empvalidate() {
var exists = false; // default return value is false
var empno = $("#empno").val();
if (empno != '') {
$.ajax({
url: "emp.php",
async: false,
dataType: "json",
data: {'param1': $("#param1").val(), 'empno': $("#empno").val()},
success: function (data) {
exists = data.status; // set status of existence to outer variable
}
});
}
return exists; // return actual value
}
答案 0 :(得分:2)
您的同步请求将导致UI线程(以及浏览器)等待XMLHttpRequest
对象返回(无论是失败还是成功,都会有种类)。
jQuery将执行您的成功/完成和错误处理程序,就像您使用“正常”异步请求时执行的那样。但它会在它出现之前等待/阻止。
因此,最糟糕的情况是,实际请求需要花费大量时间。网络latencys在这种情况下非常糟糕,数据量很大......所有这些都将完全锁定你的UI线程,这显然是一个令人敬畏的用户期限。
我真的不知道现在有人应该使用同步的ajax请求。
答案 1 :(得分:0)
而不是使用async: false
,你最好做这样的事情:
function begin_ajax() {
// Set your UI states here
}
function success_ajax(data) {
// Run whatever needs to run if the request is successful.
}
function error_ajax(xhr, error_type, msg) {
// Display error messages
}
function complete_ajax() {
// Clean up UI
}
$.ajax({
beforeSend: begin_ajax,
success: success_ajax,
error: error_ajax,
complete: complete_ajax
// Your parameters here
});
答案 2 :(得分:0)
使用完整功能并为“超时”提供案例
完成(XMLHttpRequest的, textStatus) - 功能
一个功能 请求完成时调用 (在成功和错误回调之后 执行)。该函数被传递 两个参数:XMLHttpRequest 对象和分类的字符串 请求的状态(“成功”, “notmodified”,“error”,“timeout”或 “parsererror”)。这是一个Ajax事件。
所以Code在你的ajax上看起来像这样:
function empvalidate() {
var exists = false; // default return value is false
var empno = $("#empno").val();
if (empno != '') {
$.ajax({
url: "emp.php",
async: false,
dataType: "json",
data: {'param1': $("#param1").val(), 'empno': $("#empno").val()},
success: function (data, ts) {
if(ts == "success")
exists = data.status; // set status of existence to outer variable
else if(ts == "timeout")
{
$(document).trigger('customTimeoutHandler');
}
}
});
}
return exists; // return actual value
}
此处不确定应用程序,但请记住,您也可以在此处设置自定义超时变量。不太确定你想要它是什么,它只取决于你的情况。