Wait until all jQuery Ajax requests are done?

后端 未结 21 1790
离开以前
离开以前 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:29

    On the basis of @BBonifield answer, I wrote a utility function so that semaphore logic is not spread in all the ajax calls.

    untilAjax is the utility function which invokes a callback function when all the ajaxCalls are completed.

    ajaxObjs is a array of ajax setting objects [http://api.jquery.com/jQuery.ajax/].

    fn is callback function

    function untilAjax(ajaxObjs, fn) {
      if (!ajaxObjs || !fn) {
        return;
      }
      var ajaxCount = ajaxObjs.length,
        succ = null;
    
      for (var i = 0; i < ajaxObjs.length; i++) { //append logic to invoke callback function once all the ajax calls are completed, in success handler.
        succ = ajaxObjs[i]['success'];
        ajaxObjs[i]['success'] = function(data) { //modified success handler
          if (succ) {
            succ(data);
          }
          ajaxCount--;
          if (ajaxCount == 0) {
            fn(); //modify statement suitably if you want 'this' keyword to refer to another object
          }
        };
        $.ajax(ajaxObjs[i]); //make ajax call
        succ = null;
      };
    

    Example: doSomething function uses untilAjax.

    function doSomething() {
      // variable declarations
      untilAjax([{
        url: 'url2',
        dataType: 'json',
        success: function(data) {
          //do something with success data
        }
      }, {
        url: 'url1',
        dataType: 'json',
        success: function(data) {
          //do something with success data
        }
      }, {
        url: 'url2',
        dataType: 'json',
        success: function(response) {
          //do something with success data
        }
      }], function() {
        // logic after all the calls are completed.
      });
    }
    

提交回复
热议问题