Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как узнать, завершила ли свою работу рекурсивная функция (https://javascript.ru/forum/misc/3665-kak-uznat-zavershila-li-svoyu-rabotu-rekursivnaya-funkciya.html)

Ajax 13.05.2009 13:58

Как узнать, завершила ли свою работу рекурсивная функция
 
Здраствуйте у меня есть несколько рекурсивных функций которые вызывают сами себя, все они заканчивают свою работу по разному, какаято закончила а какаято еще вызывается, так вот нужно периодически узнавать, завершили ли все функции свою работу. У меня для этого сделан объект, при завершении работы функции, в соответствующее свойство объекта записывается false а когда он работает это свойство принимает true, и периодически проверяю есть ли в объекте свойства с true, если нет то соответственно работа функций прекратилась и можно ехать дальше...
function isCompleteResize() {
	for(var prop in isResize) {
		if(isResize[prop]) isResizeArr.push('1');		
	}	
	if(isResizeArr.length == 0) {работа функций прекратилась, совершаем дальнейшие действия}
 	else {isResizeArr.length = 0; setTimeout(isCompleteResize,100);}
}

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

Kolyaj 13.05.2009 14:08

Или вы не понимаете, что такое рекурсия, или еще что-нибудь, не буду телепатически предполагать что.
function func(i) {
    // Я рекурсивная функция, вот я рекурсивно вызываю сама себя
    // Пока я тут вызываю сама себя, никакие другие функции выполняться не могут.
    if (i > 0)
        func(i - 1);
    // А вот я выхожу из себя, т.е. заканчиваю свою работу
    return;
}

func(100);
alert('Функция завершила свою работу.');


telepat mode: Если вы используете setTimeout, то это не рекурсия.

x-yuri 13.05.2009 14:13

по поводу "проверять автоматически": лучше вызвать callback, когда завершилось выполнение функций

если неизвестен порядок "завершения функций", то можно создать переменную, в которую изначально записать количество функций, и при каждом "завершении" уменьшать этот счетчик, а когда он станет равным нулю - вызвать callback

Ajax 13.05.2009 14:39

те если функция вызывает саму себя через таймаут, то она не рекурсивная и таких функций может работать несколько одновременно..? просто в некоторый браузерах они выполняются по очереди

x-yuri 13.05.2009 14:50

Цитата:

те если функция вызывает саму себя через таймаут, то она не рекурсивная
строго говоря - нет, не строго - не обязательно

Цитата:

таких функций может работать несколько одновременно
в пределах одного окна (фрейма) не может работать несколько функций одновременно - http://javascript.ru/tutorial/events/timing


Часовой пояс GMT +3, время: 12:16.