Не верно работает логика скрипта continue



  • Есть список страниц.
    Надо их проверить на наличие элементов и сорвешить действия.

    Логика скрипта:

    БЕРЕМ СПИСОК ЭЛЕМЕНТОВ

    ЗАПУСКАЕМ ЦИКЛ FOREACH

    ФУНКЦИЯ 1
    Загрузка страницы
    Проверка 1
    Если TRUE то запись в Лог и след. итерация цикла.(continue)
    Иначе
    Проверка 2
    Если TRUE то запись в Лог и след. итерация цикла.(continue)
    Иначе
    Проверка 3
    Если TRUE то запись в Лог и след. итерация цикла.(continue)
    Иначе
    Клик на элемент и запись в Лог

    ФУНКЦИЯ 2
    Проверка 1
    Если TRUE то запись в Лог и след. итерация цикла.(continue)
    Иначе
    Проверка 2
    Если TRUE то запись в Лог и след. итерация цикла.(continue)
    Иначе
    Клик на элемент
    Проверка 3
    Если TRUE то запись в Лог и след. итерация цикла.(continue)
    Иначе
    Клик на элемент, запись в Лог, клик на элемент

    Success

    Все страницы корректно проверяються кроме одной.
    В момент Проверки 1 в Функции 1 возвращается TRUE, но цикл не переходит на след. итерацию а продолжает работать в текущей до момента "Клик на элемент в Проверке 2 Функции 2" и останавливается потому, что не может найти элемент на странице на который нужно кликнуть.

    Как исправить, что бы логика скрипта continue возвращала на след. итерацию?



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



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



  • @ruzne said in Не верно работает логика скрипта continue:

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

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

    @ruzne said in Не верно работает логика скрипта continue:

    использовать готу, поставить метку энд в конце цикла и прыгать на ней.

    go to - это установить метку/перейти к метке? А где будет тогда конец цикла, в конце второй функции или после нее?Или как то еще?

    @ruzne said in Не верно работает логика скрипта continue:

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

    Тобишь нет разницы использовать цикл или метку так как работают они одинаково?



  • @ruzne Что ты несешь?
    @zizitop
    В бас все действия - это функции. Даже циклы. Continune по сути делает переход в старт этой же функции. Break прерывает функцию.
    Не нужно усложнять скрипт метками, просто устанавливайте какую то переменную в функции в определенное значение, а при выходе из функции проверять эту переменную



  • @DrPrime said in Не верно работает логика скрипта continue:

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

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



  • @DrPrime

    два то зачем, одного бы хватило

    @ruzne said in Не верно работает логика скрипта continue:

    вероятно

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

    вместо континуе

    _next(2)
    

    вместо бряка

    _break(2)
    

    2 - по числу вложеностей.

    вот, функции сремные.
    @DrPrime
    претензия к функциям следующая

    function a(){
      log('1');
      i++;
      if(i<5){
        a();
      }else{
        log('2');
      }
      log('3');
    }
    i=0;
    a();
    

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



  • @ruzne said in Не верно работает логика скрипта continue:

    чтобы прямо исправится за все косяки за которые меня тут подтягивают предложу использовать
    вместо континуе
    _next(2)

    вместо бряка
    _break(2)

    2 - по числу вложеностей.

    А как этот самый _next(2) мне впихнуть и в виде чего, переменной или как произвольный код или без разницы?



  • @zizitop
    выполнить код я думаю



  • @ruzne said in Не верно работает логика скрипта continue:

    @zizitop
    выполнить код я думаю

    Не не хочет(
    Можешь глянуть скрипт в ЛС?
    Может ошибка во мне.



  • @zizitop
    ну если там еще и иф есть то _next(3)
    как сказал @DrPrime иф тоже вроде функции, получается еще один уровень вложености



  • @zizitop
    посмотрел
    не break() и next(), а _break() и _next()



  • @zizitop
    в данном конкретном случае _next(3) точно работает как континуе для внешнего по отношению к функции циклу
    я провелил, если степень вложености изменится, то насколько выше или ниже нужно будет другой аргумент некст указывать, вероятно можно не только на сколько выше ниже указать но и метку в дефолтном континуе например внутри на самом деле вызов _next("function")
    я вот еще закгрузку в игнорировать ошибки обернул чтобы это заработало



  • @ruzne Да, если загрузку обернуть в игнор ошибок все работает с некстом.

    @ruzne said in Не верно работает логика скрипта continue:

    вероятно можно не только на сколько выше ниже указать но и метку в дефолтном континуе например внутри на самом деле вызов _next("function")

    А как реализуется эта самая "метка в дефолтном континуе", что то не пойму?



  • @zizitop
    хез



  • @zizitop
    Тебе нужно вместо Continune в функциях сделать Выполнить код

    VAR_NEED_NEXT = true
    _break()
    

    В цикле после каждой функции блок IF с условием [[NEED_NEXT]]
    Внутри которого
    Установить переменную NEED_NEXT в значение false с типом данных expression
    И блок Continune

    Так же перед циклом
    Установить переменную NEED_NEXT в значение false с типом данных expression

    Костыль конечно, но по другому никак


Log in to reply