如何在新线程中调用ajax请求或任何简单函数?
我知道async: false
,但我的代码有这样的结构:
1.用户点击某个项目,然后点击此事件 2.在事件中我称之为此功能
var myData= {};
$.ajax({
type: "GET",
url: "...",
contentType: "application/json; charset=utf-8",
async: false,
cache: false,
dataType: "json",
success: function (s0) {
myData.s0= s0;
$.ajax({
type: "GET",
url: "sss",
contentType: "application/json; charset=utf-8",
async: false,
cache: false,
dataType: "json",
success: function (s1) {
myData.s1 = s1;
$.ajax({
type: "GET",
url: "...",
contentType: "application/json; charset=utf-8",
async: false,
cache: false,
dataType: "json",
success: function (s2) {
myData.s2= s2;
}
});
}
});
}
});
// I need call this function when all ajax are done.
myFunc(myData);
我当前的代码有效,但导致网络冻结,直到数据未下载为beaouse我有asyn: false
但我不知道如何异步解决它
对我来说,最佳解决方案就是调用此冻结并显示加载gif直到完成。
答案 0 :(得分:0)
在所有ajax调用上将async:false
更改为async:true
,在函数开头显示加载gif,初始化myData
并在加载所有数据时调用要调用的函数在最后一次ajax调用的成功函数中(在myData.s2 = s2
之后)
答案 1 :(得分:0)
在同步AJAX期间没有针对UI冻结的修复,因此您可能想尝试Web工作者,但它有自己的警告。我建议您使用jquery promise,这样您就不需要定义单独的成功,错误的回调。承诺保证在链的末尾产生这样的结果你要么在myData中有值,要么不会永远挂起
//show loader
$.ajax({
type: "GET",
url: "...",
contentType: "application/json; charset=utf-8",
async: false,
cache: false,
dataType: "json",
}).then(function( s0, textStatus, jqXHR ){
myData.s0= s0;
return $.ajax( {
type: "GET",
url: "sss",
async: false,
cache: false,
dataType: "json"} );
}).then(function( s1, textStatus, jqXHR ) {
myData.s1 = s1;
$.ajax( {
type: "GET",
url: "...",
async: false,
cache: false,
dataType: "json"});
}).then(function( s2, textStatus, jqXHR ) {
myData.s2= s2;
//hide loader
})