Как правильно создавать и вызывать функции через блоки Выполнить код?



  • Например, в первом блоке у меня так:

    myfunc = function() {
       _if (1, function() { ... })!
       return true;
      // _return(true); - этот вариант тоже не работает
    }
    

    Второй блок если сделать так, то после вызова ф-ции код прерывается, то есть log() не выполняется:

    var res = myfunc();
    log('...')
    

    А если так, то res всегда null, хотя должен true:

    _call_function(myfunc,{})!
    var res = _result_function()
    

    Тестовый скрипт: 0_1568630416526_test_cutomfunc.xml



  • Разобрался: надо _function_return() использовать



  • @agility said in Как правильно создавать и вызывать функции через блоки Выполнить код?:

    Например, в первом блоке у меня так:

    myfunc = function() {
       _if (1, function() { ... })!
       return true;
      // _return(true); - этот вариант тоже не работает
    }
    

    Второй блок если сделать так, то после вызова ф-ции код прерывается, то есть log() не выполняется:

    var res = myfunc();
    log('...')
    

    А если так, то res всегда null, хотя должен true:

    _call_function(myfunc,{})!
    var res = _result_function()
    

    Тестовый скрипт: 0_1568630416526_test_cutomfunc.xml

    Объявляете функции со всеми действиями

    get_ip = function () {
        _switch_http_client_main()
        http_client_get2("https://fingerprints.bablosoft.com/ip", { method: ("GET"), headers: ("") })!
        VAR_SAVED_CONTENT = http_client_encoded_content("auto")
        log(VAR_SAVED_CONTENT)
    }
    
    query_result = function () {
        VAR_NEW_LIST = []
        load("https://www.google.com/search?q=site:https://community.bablosoft.com%20%D0%BB%D0%B0%D0%B9%D1%84%D1%85%D0%B0%D0%BA")!
        _SELECTOR = " \u003eXPATH\u003e //span[@class=\u0022st\u0022]";
        wait_element(_SELECTOR)!
        get_element_selector(_SELECTOR, true).length()!
        ELEMENT_LENGTH_109692 = _result()
        _do(function () {
            VAR_CYCLE_INDEX = _iterator() - 1
            VAR_FOR_EACH_XPATH = " \u003eXPATH\u003e //span[@class=\u0022st\u0022]"
            if (VAR_CYCLE_INDEX >= ELEMENT_LENGTH_109692) _break();
            _SELECTOR = VAR_FOR_EACH_XPATH + "\u003eAT\u003e" + VAR_CYCLE_INDEX;
            wait_element(_SELECTOR)!
            get_element_selector(_SELECTOR, false).text()!
            VAR_SAVED_TEXT = _result()
            VAR_NEW_LIST.push(VAR_SAVED_TEXT)
        })!
        delete ELEMENT_LENGTH_109692
        VAR_NEW_LIST.forEach(function (item) {
            log(item)
        });
    }
    

    и вызываете их в любом удобном для вас месте

    _if (1, function() {
        _call(get_ip, null)!
    })!
    
    _if (1, function() {
        _call(query_result, null)!
    })!
    

    Тестовый скрипт



  • @fox Спасибо.
    Мне что-то всё не везет на этот интерпретатор. Ниже работает скрипт бесконечно. В чем ошибка? Если _if на if поменять, то работает верно, но я это не могу сделать, потому что в реальном скрипте сложные многоуровневые условия и там необходимо _if применять

    _do(function() {
        log('iterator: ' + _iterator())
    
        _if (_iterator() == 3, function() {
            _break()
        })!
    
        sleep(1000)!
    })!
    


  • @agility said in Как правильно создавать и вызывать функции через блоки Выполнить код?:

    @fox Спасибо.
    Мне что-то всё не везет на этот интерпретатор. Ниже работает скрипт бесконечно. В чем ошибка? Если _if на if поменять, то работает верно, но я это не могу сделать, потому что в реальном скрипте сложные многоуровневые условия и там необходимо _if применять

    _do(function() {
        log('iterator: ' + _iterator())
    
        _if (_iterator() == 3, function() {
            _break()
        })!
    
        sleep(1000)!
    })!
    

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

    function qq() {
        log("qq")
    }
    
    _do(function () {
        if (_iterator() - 1 > 3) _break();
        _if(_iterator() - 1 < 2, function () {
            _call_function(qq, {})!
            //_result_function()
        })!
    })!
    
    


  • @agility

    _do(function() {
        log('iterator: ' + _iterator())
    
        _if (_iterator() == 3, function() {
            _break(2)
        })!
    
        sleep(1000)!
    })!
    


  • @usertrue работает, спасибо! Работает вижу при _break >= 2 в параметрах. Не знаешь, что 2 означает, в принципе? Откуда ты так же узнал про этот параметр (что бы на будущее я сам находил)?

    @fox так смотри, а если у меня вложенность как на скрине в нормальном виде блоками? Такая логика с Выполнением кода в цикле почти у всех может встречаться.

    0_1568713225121_br.png



  • @agility 2 это уровень вложенности. В Бас все не такое каким кажется. Изучайте исходники.



  • @usertrue Возможно ли как-нибудь получить текущий ур-нь вложенности в Выполнить код до выполнения _do()? Например, на скрине ниже ур-нь вложенности в _do() 1 или 3 будет верный? Если 1, то понятно как работать, а если 3, то как тогда получить текущий ур-нь программно?

    0_1568717206982_lr.png



  • @agility Лучше писать на кубиках в таком случае.



  • @agility said in Как правильно создавать и вызывать функции через блоки Выполнить код?:

    Например, в первом блоке у меня так:

    myfunc = function() {
       _if (1, function() { ... })!
       return true;
      // _return(true); - этот вариант тоже не работает
    }
    

    Второй блок если сделать так, то после вызова ф-ции код прерывается, то есть log() не выполняется:

    var res = myfunc();
    log('...')
    

    А если так, то res всегда null, хотя должен true:

    _call_function(myfunc,{})!
    var res = _result_function()
    

    Тестовый скрипт: 0_1568630416526_test_cutomfunc.xml

    Продублирую здесь ответ @support

    Таких изменений не будет.
    
    Писать такой код крайне не рекомендуется. Под "такой" я имею ввиду писать код целиком с
    использованием внутренних расширений БАС. Это приводило не раз и приведет в вашем случае
    к ошибкам, которые очень трудно выловить и исправить.
    
    Если нужно писать скрипт целиком на js, используйте node.js
    

Log in to reply
 

  • 5
  • 7
  • 12
  • 1
  • 8
  • 4
  • 14
  • 3