Запустить обратный вызов после завершения цикла jQuery while

Я пытаюсь выполнить функцию после того, как цикл jQuery while завершил цикл по своим настройкам. Петли находятся ближе к низу

Вот мой текущий скрипт:

$(document).ready(function() {


$("#radial_container").radmenu({
    listClass: 'list', // the list class to look within for items
    itemClass: 'item', // the items - NOTE: the HTML inside the item is copied into the menu item
    radius: 150, // radius in pixels
    animSpeed:400, // animation speed in millis
    centerX: 160, // the center x axis offset
    centerY: 150, // the center y axis offset
    selectEvent: "click", // the select event (click)
    activeItemClass: "active",
    angleOffset: 185, // in degrees
    onSelect: function ($selected) {
        $(".radial_div_item").animate({
            //opacity: 0.5
        }, 0);
        $selected.animate({
            //opacity: 1
        }, 0);
        var inner = $selected.html();
        var i = 0;
        if ($selected.index() > 3) {
            while (i < $selected.index()) {
                $("#radial_container").radmenu("next");
                //Do something once loop finishes
            }
        } else {
            while ($selected.index() > i) {
                $("#radial_container").radmenu("prev");
                //Do something once loop finishes
            }
        }
    }

});
});

Друг предложил мне сделать что-то вроде этого, но это пока не сработало для меня:

var looping = function(callback){ 
  *while loop* 
  callback();
}

Я уже прочитал этот пост, но не смог найти решение там, ссылка здесь.

Я не включил свою разметку, потому что это показалось ненужным, но если это необходимо, я могу опубликовать его.

Спасибо всем.


person daniel blythe    schedule 04.07.2013    source источник


Ответы (2)


Во-первых, похоже, что ваши циклы перестраиваются и никогда не закончатся.

while ($selected.index() > i) {
    $("#radial_container").radmenu("prev");
    //Do something once loop finishes
}

Если этот код $("#radial_container").radmenu("prev"); автоматически не увеличивает index() из $selected, этот цикл будет продолжаться вечно, поэтому вам нужно изучить возможность ручного увеличения вашего $selected.index() или i после каждой итерации цикла.

Но ответ на этот вопрос довольно прост, вам не нужно запускать свою функцию внутри цикла, вы можете запустить ее вне цикла, но внутри оператора if. Итак, как только цикл завершит итерацию, функция запустится, вот так.

if ($selected.index() > 3) {
    while (i < $selected.index()) {
        $("#radial_container").radmenu("next");
    }
    runFunctionHere();
} else {
    while ($selected.index() > i) {
        $("#radial_container").radmenu("prev");
    }
    runFunctionHere();
}

Надеюсь, это поможет.

person lukehillonline    schedule 05.07.2013

Но если вы просто не оберните это так:

while ($selected.index() > i) {
    $("#radial_container").radmenu("prev");
}
//Do something once loop finishes

Это будет работать! Или я что-то упускаю?

person A. Wolff    schedule 04.07.2013
comment
Спасибо за ваш ответ. Я так и думал, но если я поставлю его туда, он сработает сразу и не будет ждать завершения цикла. Любые другие мысли? Спасибо еще раз. - person daniel blythe; 04.07.2013
comment
Ну, код, который вы видите в цикле сейчас, является единственным кодом там. Если вы имеете в виду, что делает $O('').radmenu()('prev'). это функция, которая является частью плагина и перемещает что-то вроде карусели вокруг одной позиции. Я почти уверен, что не подаю в суд на какие-либо асинхронные функции, хотя могу ошибаться: S. - person daniel blythe; 04.07.2013
comment
Это не работает, у меня есть две небольшие функции с анимацией в цикле while, и у меня есть функция для скрытия div, я едва вижу, как первая анимация начинается до того, как она будет скрыта, поэтому она работает асинхронно, я знаю в С# будет работать эквивалентный код, поэтому, если кто-нибудь может объяснить функциональность, пожалуйста :) - person Mikael Puusaari; 28.11.2020