如何异步使用ajax调用并显示加载器直到完成?

时间:2016-10-15 09:14:32

标签: javascript jquery ajax multithreading loader

如何在新线程中调用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直到完成。

2 个答案:

答案 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
})

Read more