Wait until all jQuery Ajax requests are done?

后端 未结 21 1797
离开以前
离开以前 2020-11-21 04:39

How do I make a function wait until all jQuery Ajax requests are done inside another function?

In short, I need to wait for all Ajax requests to be done before I exe

21条回答
  •  借酒劲吻你
    2020-11-21 05:40

    As other answers mentioned you can use ajaxStop() to wait until all ajax request are completed.

    $(document).ajaxStop(function() {
         // This function will be triggered every time any ajax request is requested and completed
    });
    

    If you want do it for an specific ajax() request the best you can do is use complete() method inside the certain ajax request:

    $.ajax({
        type: "POST",
        url: "someUrl",
        success: function(data) {
            // This function will be triggered when ajax returns a 200 status code (success)
        },
        complete: function() {
            // This function will be triggered always, when ajax request is completed, even it fails/returns other status code
        },
        error: function() {
            // This will be triggered when ajax request fail.
        }
    });
    


    But, If you need to wait only for a few and certain ajax request to be done? Use the wonderful javascript promises to wait until the these ajax you want to wait are done. I made a shortly, easy and readable example to show you how does promises works with ajax.
    Please take a look to the next example. I used setTimeout to clarify the example.

    // Note:
    // resolve() is used to mark the promise as resolved
    // reject() is used to mark the promise as rejected
    
    $(document).ready(function() {
        $("button").on("click", function() {
    
            var ajax1 = new Promise((resolve, reject) => {
                $.ajax({
                    type: "GET",
                    url: "https://miro.medium.com/max/1200/0*UEtwA2ask7vQYW06.png",
                    xhrFields: { responseType: 'blob'},
                    success: function(data) {
                        setTimeout(function() {
                            $('#image1').attr("src", window.URL.createObjectURL(data));
                            resolve(" Promise ajax1 resolved");
                        }, 1000);
                    },
                    error: function() {
                        reject(" Promise ajax1 rejected");
                    },
                });
            });
    
            var ajax2 = new Promise((resolve, reject) => {
                $.ajax({
                    type: "GET",
                    url: "https://cdn1.iconfinder.com/data/icons/social-media-vol-1-1/24/_github-512.png",
                    xhrFields: { responseType: 'blob' },
                    success: function(data) {
                        setTimeout(function() {
                             $('#image2').attr("src", window.URL.createObjectURL(data));
                             resolve(" Promise ajax2 resolved");
                        }, 1500);
                    },
                    error: function() {
                        reject(" Promise ajax2 rejected");
                    },
                });
            });
    
            var ajax3 = new Promise((resolve, reject) => {
                $.ajax({
                    type: "GET",
                    url: "https://miro.medium.com/max/632/1*LUfpOf7teWvPdIPTBmYciA.png",
                    xhrFields: { responseType: 'blob' },
                    success: function(data) {
                        setTimeout(function() {
                             $('#image3').attr("src", window.URL.createObjectURL(data));
                             resolve(" Promise ajax3 resolved");
                        }, 2000);
                    },
                    error: function() {
                        reject(" Promise ajax3 rejected");
                    },
                });
            });
            
            Promise.all([ajax1, ajax2, ajax3]).then(values => {
                console.log("We waited until ajax ended: " + values);
                console.log("My few ajax ended, lets do some things!!")
            }, reason => {
                console.log("Promises failed: " + reason);
            });
            
            // Or if you want wait for them individually do it like this
            // ajax1.then(values => {
            //    console.log("Promise 1 resolved: " + values)
            // }, reason => {
            //     console.log("Promise 1 failed: " + reason)
            // });
        });
    
    });
    img {
      max-width: 200px;
      max-height: 100px;
    }
    
    
    

提交回复
热议问题