如何更新AJAX中的父函数中的变量而不使用ASYNC FALSE

时间:2017-08-26 16:18:57

标签: javascript jquery ajax asynchronous

默认情况下,AJAX是异步的,从jquery 1.8开始,不建议使用async:false。我不希望打破AJAX的异步属性。我在这里找到的大多数答案都说设置async false。那么什么是更好的方法呢?我想在所有循环完成后更新计数。

$.ajax({
  url: "...", 
  success: function (objects) {
    var count = 0; 

    for (var i = 0; i < objects.length; i++) { 
      logObject(object[i], count); // update count in every loop
    }

    console.log(count); // ALWAYS 0
  }
});

function logObject(object, count) {
  $.ajax({
    url: "...", 
    success: function (result) {
      console.log(object.item); // works fine
      count+=result.count; // count increases everytime unless result.count is 0
    }
  });
}

2 个答案:

答案 0 :(得分:0)

一种方法是在开始时递增计数器并在完成时减少,如下所示:

var activeAjaxConnections = 0;

.ajax({
  beforeSend: function(xhr) {
    activeAjaxConnections++;
  },
  success: function(resp) {
    activeAjaxConnections--;
     if (activeAjaxConnections === 0) {
        // done.....
     }
  },
  error: function(xhr, errDesc, exception) {
    activeAjaxConnections--;
  }
});

或者 - 更全球化 - 您可以使用:ajaxComplete

答案 1 :(得分:0)

首先,您将"count"参数传递给函数并在此函数内更新它。它永远不会起作用,因为"count"是一个基本类型,是整数,并且在函数"logObject"中,您将使用"count"的副本按值传递。

$.ajax({
  url: "...", 
  success: function (objects) {
    var count = 0; 

    for (var i = 0; i < objects.length; i++) { 
      logObject(object[i]).success(function(result){
          count += result.count; 

          if((i + 1) === objects.length){
              //Here you finished the loop
              console.log(count);
          }
      }); // update count in every loop
    }
  }
});

function logObject(object) {
  return $.ajax({
    url: "..."
  });
}