Wait for multiple getJSON calls to finish

前端 未结 2 1443
深忆病人
深忆病人 2020-12-15 02:20

I have a loop that makes calls to an API and compiles the results into an array. How do I wait until all of the calls are finished until resuming execution? I see a bunch of

相关标签:
2条回答
  • 2020-12-15 02:45

    getData will return a promise which is a read-only version of a deferred. You can then execute code based on the resolution of these promises using $.when

    0 讨论(0)
  • 2020-12-15 02:49

    This is easy if you use jQuery's deferreds. There is a method, $.when, that waits for multiple promises to complete then runs a callback. That's what you should use here.

    Don't use a global obj variable, you can just use the returns from the AJAX calls.

    function getData(id) {
        var thisI = i;
        var url = "www.whatever.com?id=" + id;
        return $.getJSON(url);  // this returns a "promise"
    }
    

    So, instead of populating obj, we just return the promise. Then in your loop, you collect all of them.

    var AJAX = [];
    for (i=0; i < ids.length; i++) {
        AJAX.push(getData(ids[i]));
    }
    

    Then we need to hook up the callback when all of them are done:

    $.when.apply($, AJAX).done(function(){
        // This callback will be called with multiple arguments,
        // one for each AJAX call
        // Each argument is an array with the following structure: [data, statusText, jqXHR]
    
        // Let's map the arguments into an object, for ease of use
        var obj = [];
        for(var i = 0, len = arguments.length; i < len; i++){
            obj.push(arguments[i][0]);
        }
    
        document.getElementById("txt").innerHTML = obj[0]['field'];
    });
    
    0 讨论(0)
提交回复
热议问题