2015-04-24 2 views
1

Я бегу match(), чтобы пройти через массив или остановить идентификаторы. Для каждого идентификатора остановки я вызываю функцию, которая пересекает другой массив идентификаторов маршрута и через ответ вызова 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"); 
    } 
    }); 
} 

консоли журнала Выход:

Match Array Output: 
jp-main.js (line 177) 
2 
115 
jp-main.js (line 199) 
2 
113 
jp-main.js (line 199) 
2 
087 
+0

добавить счетчик, который приращениями на успех или ошибки, и когда он соответствует 'fromStopsAr.length', все готово. – Ted

+0

@ brso05 Как бы это сделать, поскольку я многократно называю 'getFromRoutesStopId (id)'. – Yonkee

+0

@Ted Будет ли этот счетчик находиться на закрытии блока успеха при вызове Ajax? – Yonkee

ответ

2

Вы можете использовать счетчик ... вроде как:

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"); 
    } 
    }); 
} 
0

Вы можете вернуть обещание и использовать $ .when

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"); 
    } 
    }); 
} 
+0

Спасибо за ответ. Однако даже с помощью этого я все равно получаю «Match output» как пустой, до того, как обновится ajax массив. – Yonkee

0

Имея дело с 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(); 
     } 
    }); 
}; 
Смежные вопросы