максимальный размер стека вызовов превышен в Mapbox - PullRequest
0 голосов
/ 21 февраля 2019

Я создал проект, используя mapbox, и я пытаюсь анимировать значок по маршруту.Это пример кода моей функции анимации: `

function animateicon(route,point,map) {
        point.features[0].geometry.coordinates = route.features[0].geometry.coordinates[counter];
        if (counter==route.features[0].geometry.coordinates.length-1)
           {

               point.features[0].geometry.coordinates = route.features[0].geometry.coordinates[0]
               map.getSource('point').setData(point);
               counter = 0;


                 }
        point.features[0].properties.bearing = turf.bearing(

            turf.point(route.features[0].geometry.coordinates[counter >= steps ? counter - 1 : counter]),
            turf.point(route.features[0].geometry.coordinates[counter >= steps ? counter : counter + 1])
        );
        map.getSource('point').setData(point);
        if (counter < 100) {
            console.log(counter);
            counter = counter + 1;          
            animateicon(route, point,map);
               }

       }

Все работает нормально, но через некоторое время я получаю это исключение" превышен максимальный размер стека вызовов ". Есть ли способ, как я могу это исправить?

1 Ответ

0 голосов
/ 21 февраля 2019

В javascript, когда функция выполняется, есть специальное место, называемое «стек вызовов», где фактически находится стек (очередь) всех выполняемых методов.Если, например, у вас есть функция A, которая вызывает функцию B внутри нее, которая вызывает функцию C внутри нее, вы по существу создаете стек вызовов в следующем порядке:

|A|
|B|
|C|

Когда функция завершила выполнение, она по существупередает время выполнения каждому вызываемому пользователю, или, другими словами, стек оценивается сверху вниз, и каждый раз, когда функция возвращает выполнение, перемещается на 1 уровень вверх по стеку.

Теперь, когда мы говорим, что "максимальный вызов«Превышен стек» - это означает, что ваш стек вызовов теперь настолько велик, что ссылки больше не могут удерживаться, и поэтому все обрывается.

Это обычно происходит только в случае сбоя рекурсивных функций.У вас есть рекурсивная функция, и, похоже, ошибка состоит в том, что не существует «нормальной / логической» точки, в которой она прекращает выполнение большего количества рекурсий и просто возвращает, разворачивая стек вызовов назад.

По сути, ваша ошибка должнабыть где-то на этих строках:

if (counter < 100) {
    console.log(counter);
    counter = counter + 1;          
    animateicon(route, point,map);
       }

, где происходит реальный вызов рекурсии.Убедитесь, что счетчик действительно увеличен на 1 и что область действия переменной counter является правильной.Поскольку вы используете эту переменную в качестве логики завершения, на вашем месте я бы передал эту переменную в строку рекурсии следующим образом:

var counter=0;
function animateicon(route,point,map,counter){ .... }

, а затем позже:

if (counter < 100) {
    console.log(counter);
    counter = counter + 1;          
    animateicon(route, point,map,counter);
       }
...