Я получаю ошибку "слишком много рекурсии".Я постараюсь дать четкий аналог моего фактического приложения, где эта проблема возникает.
Представьте, что приложение пытается вызвать веб-службу, чтобы получить информацию о содержимом очень длинного грузового поезда.Существует так много информации, что мы не можем просто вызвать веб-службу и сказать ей, чтобы она отправляла все сразу за каждую машину во всем поезде.Скорее, мы спрашиваем веб-сервис о каждом грузовом вагоне по очереди, и когда получаем информацию об одном вагоне, мы обновляем страницу и затем запрашиваем следующий вагон.
Чтобы клиент оставался отзывчивым, мы избегаем зацикливания и используем вместо него события с array.shift ():
У нас есть событие:
$('body').bind('NextBoxCar', function( e, p) { getNexBoxCar(e,p); });
У нас естьфункция, которая удаляет первый boxcarid из массива и отправляет его веб-службе:
EDIT: BoxCarIds is not a global but inside a function
function() foo {
var BoxCarIds = [123, 222, 767, 1234, 9298, ... 999];
$('body').triggerHandler('NextBoxCar', BoxCarIds);
}
function getNextBoxCar(e, BoxCarIds) {
var id = BoxCarIds.shift();
// build an ajax request; omitted for brevity
$.ajax( {
.
. <snip>
.
success: function(data, textStatus, oHTTP ) {
UpdatePage(data, BoxCarIds);
}
});
}
Когда данные для boxcar возвращаются из веб-службы, обработчик успеха ajax вызывает следующую функцию, которая обновляетстраницы, а затем запускает событие NextBoxCar.Я считаю, что именно здесь возникает проблема рекурсии.
function UpdatePage(data, BoxCarIds) {
// update the page with data
.
. <snip>
.
// if there are still ids remaining in the array, we need to call the webservice again by firing the event
if (BoxCarIds.length > 0 ) {
$('body').triggerHandler('NextBoxCar', BoxCarIds);
}
}
Как избежать проблемы рекурсии?
Спасибо