Javascript 如何检查循环启动的功能何时完成?

Javascript 如何检查循环启动的功能何时完成?,javascript,jquery,ajax,loops,Javascript,Jquery,Ajax,Loops,我正在运行match()。对于每个stop ID,我调用一个函数,该函数通过另一个route ID数组和AJAX调用的响应循环查找匹配项 如果它在数组中找到routeID和routeID之间的匹配项,则会将结果添加到每个循环中的另一个数组中 我的问题是,我找不到一种方法来确定match()循环调用的函数何时完成 我需要这样做的原因是,我需要确保jpFromStops数组是完整的,并且可以由另一个函数处理 最好的方法是什么 function match() { // Arra

我正在运行
match()。对于每个stop ID,我调用一个函数,该函数通过另一个route ID数组和AJAX调用的响应循环查找匹配项

如果它在数组中找到routeID和routeID之间的匹配项,则会将结果添加到每个循环中的另一个数组中

我的问题是,我找不到一种方法来确定match()循环调用的函数何时完成

我需要这样做的原因是,我需要确保
jpFromStops
数组是完整的,并且可以由另一个函数处理

最好的方法是什么

   function match() {
        // Array length is 5
        for(i=0; i < fromStopsAr.length; i++) {
            getFromRoutesStopId(fromStopsAr[i]);
        }
        console.log("Match Array Output: " + jpFromStops.toString());
    }

function getFromRoutesStopId(id) {
   jpFromStops=[];
   tempAr = [];

  jQuery.ajax({
    type: "GET",
    url: 'http://apu-url.com/v1/gtfs/routes/stopid/'+id+'?api_key=API_KEY',
    dataType: "jsonp",
    cache: false,
    crossDomain: true,
    processData: true,

    success: function (data) {
    $.each( matchRoutes, function(index, value) {
      $.each(data.response, function(key, data) {
          if(data.route_short_name.toString() == value) {
             jpFromStops[jpFromStops.length] = id + ":" + value;      
          }
      });   
     }); 
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert("There is a problem");
    }
  });
}

您可以在以下情况下返回承诺并使用$

function match() {
    var promises = [];
    // Array length is 5
    for(i=0; i < fromStopsAr.length; i++) {
        promises.push(getFromRoutesStopId(fromStopsAr[i]));
    }
    $.when.apply($, promises).then(function() {
        console.log("Match Array Output: " + jpFromStops.toString());
    });
}

function getFromRoutesStopId(id) {
   jpFromStops=[];
   tempAr = [];

  return jQuery.ajax({
    type: "GET",
    url: 'http://apu-url.com/v1/gtfs/routes/stopid/'+id+'?api_key=API_KEY',
    dataType: "jsonp",
    cache: false,
    crossDomain: true,
    processData: true,

    success: function (data) {
    $.each( matchRoutes, function(index, value) {
      $.each(data.response, function(key, data) {
          if(data.route_short_name.toString() == value) {
             jpFromStops[jpFromStops.length] = id + ":" + value;      
          }
      });   
     }); 
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert("There is a problem");
    }
  });
}
函数匹配(){
var承诺=[];
//数组长度为5
对于(i=0;i
您可以使用计数器……类似于:

var count = 0;
function getFromRoutesStopId(id) {
   jpFromStops=[];
   tempAr = [];

  jQuery.ajax({
    type: "GET",
    url: 'http://apu-url.com/v1/gtfs/routes/stopid/'+id+'?api_key=API_KEY',
    dataType: "jsonp",
    cache: false,
    crossDomain: true,
    processData: true,

    success: function (data) {
    count++;
    if(count == fromStopsAr.length){your code or function call}
    $.each( matchRoutes, function(index, value) {
      $.each(data.response, function(key, data) {
          if(data.route_short_name.toString() == value) {
             jpFromStops[jpFromStops.length] = id + ":" + value;      
          }
      });   
     }); 
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      count++;
      if(count == fromStopsAr.length){your code or function call}
      alert("There is a problem");
    }
  });
}

在处理
ajax
调用时,需要等待,直到每个调用都完成执行

遵循以下模式:

var jobs = [11, 12, 14, 15];
function doTheJob() {
    if (jobs.length === 0) {
        alert('All jobs are done now.');
        complete();
        return;
    }

    var job_Id = jobs.pop();
    $.ajax({
        url: "/DoTheJob",
        complete: function () {
            doTheJob();
        }
    });
};

添加一个计数器,该计数器在成功或错误时递增,当它与
fromStopsAr.length
匹配时,您的任务就完成了。@brso05当我多次调用“getFromRoutesStopId(id)”时,我该如何做。@Ted在Ajax调用的成功块结束时,该计数器是否会出现?@Yonkee——请参阅jcubic的答案。更好的是/@brso05我不认为JSONP和跨域调用支持async:false。谢谢你的回答,但是即使使用这个,在ajax更新数组之前,我仍然得到空的“匹配输出”。
var jobs = [11, 12, 14, 15];
function doTheJob() {
    if (jobs.length === 0) {
        alert('All jobs are done now.');
        complete();
        return;
    }

    var job_Id = jobs.pop();
    $.ajax({
        url: "/DoTheJob",
        complete: function () {
            doTheJob();
        }
    });
};