Как выйти из функции js которая вызывает саму себя?
есть функция внутри которой происходит вызов этой же функции много раз в зависимости от условий, если делать return то происходит выход из какого то одного уровня вызова этой функции, а можно ли как то сделать завершение всех уровней этой функции сразу ?
прямой ответ на вопрос: через проверку того, что вернул очередной вызов себя
кривой ответ, за который могут побить: бросать исключения
реальный: если нужно что-то подобное, то обычно функция не должна быть рекурсивной изначально и её нужно переписать на обычную итерацию
winser, универсальный выход из функции именно return, причём независимо от того вызывает ли она сама себя или другие функции, и то что она вызывает саму себя никаких дополнительных возможностей не даёт, иначе функция была бы не функцией, а не пойми чем
а чтобы совсем "выйти", максимум можно упасть с ошибкой, но это будет совсем не выход а именно исключительная ситуация, использовать которую для прерывания control-flow такое себе "фе"
Kentavr16, ну я поставил ограничение на 10, пока видел помоему максимум 3, но это не предел, делаю поиск в виртуальных папках их может быть намного больше. rPman, как например тут может помочь async await ? Виктор, ну проблема была в том что у меня функция async и она почему то выполнялась дольше чем код который следовал за ней, хотя перед вызовом функции у меня стоял await, может я что то не понимаю в принципе работы async await поэтому пришла мысль что поиск надо сделать быстрее и быстрее выходить из функции если результат положительный и нет смысла искать дальше
winser, когда ты делаешь функцию async то если внутри ты вызываешь await вызов другой асинхронной функции, то текущая функция преостанавливает свою работу пока эта не завершится, соответственно делаешь рекурсию из вызовов асинхронной функции, а для 'завершения работы' делаешь специально функцию которая никогда не завершится - можно считать что произошел выход из рекурсии ;)
что происходит при return myQuery(); ? разве тут не будет бесконечный вызов функции самой себя ? я делаю вызов функции внутри самой себя только по условию
winser, return myQuery может вернуть myQuery который может вернуть myQuery который вернет done, таким образом done венется в предыдущую myQuery и это будет ответ для предыдущего myQuery, который вернет done изначальному myQuery и в итоге вернется done.
winser, сам механизм дополнительных задержек не даст, а вот внутри функции может быть просадка производительности по каким-то причинам
конструкция интересная не знал про такое
называется рекурсия
советую освоить дебагер, код можно запустить в режиме отладки и выполнять по шагам, так можно найти "узкое место" и понять в каком порядке и с какими данными что-то выполняется