Как реализовать вызов функций в кастомном интерфейсе



  • Привет. Мне нужно реализовать вызов функций через API чтобы их принцип работы был похож как в модуле BAS "Вызов асинхронной функции". Чтобы допустим у меня есть 10 строк для создания аккаунтов (см.скриншот). Нужно чтобы при нажатии на кнопку "Создать" я мог огранить количество одновременно работающих потоков. Может есть уже кого идеи?
    2020-11-30_03-44-53.png

    2020-11-30_03-35-44.png



  • @hustler35 said in Как реализовать вызов функций в кастомном интерфейсе:

    Привет. Мне нужно реализовать вызов функций через API чтобы их принцип работы был похож как в модуле BAS "Вызов асинхронной функции". Чтобы допустим у меня есть 10 строк для создания аккаунтов (см.скриншот). Нужно чтобы при нажатии на кнопку "Создать" я мог огранить количество одновременно работающих потоков. Может есть уже кого идеи?

    Ознакомьтесь с мануалом https://wiki.bablosoft.com/web-interface/#/callbasfunction

    cb0f4a78-d592-4d2a-a958-46a3db164a22-изображение.png

    и при использовании await не обязательно использовать then

    cc0dc664-905f-4239-9745-f2853bb9bf14-изображение.png

    https://tproger.ru/translations/understanding-async-await-in-javascript/



  • @Fox спасибо, немного помогли твои светы, но пока только получается сделать чтобы они все разом открывались и возвращали результат, я не заню как ограничить кол-во одновременно работающиех потоков.
    Моего опыта в программировании не хватает такое реализовать. Подскажи пожалуйста, как сделать такое. Я думаю многим кто сталкнется с этим, было бы интересно знать

    2020-12-01_02-31-31.png

    
    
    $(document).ready(function () {
    
    
    
        var app = new Vue({
            el: '#app',
            vuetify: new Vuetify(),
            data: {
                value: `Татьяна,Орлова,ж
    Галина,Замятина,ж
    Максим,Федотов,ж
    Сергей,Ковальчук,м
    Вера,Алферова,ж
    Салават,Нурмухаметов,м
    Лариса,Малахова,ж
    Екатерина,Худякова,ж
    Евгения,Отт,ж
    Аида,Хаирова,ж
    Ахтар,Баймурзин,м
    Гульнара,Иванова,ж`
            },
            methods: {
                async restartScript() {
                    Api.Restart()
                },
    
                async getValueTextArea() {
    
    
                    let regEx = /[^\r\n]+/g;
                    let nameList = this.value.match(regEx)
    
                    for (i = 0; i < nameList.length; i++) {
                        Api.RunFunction('test', { user: nameList[i] })
    
                    }
                    var RunningTasks = Api.GetTasks()
                    console.log(RunningTasks)
    
                    Object.values(RunningTasks).forEach(function (Task) {
                        console.log(Task)
                        Task.object.then((data) => console.log('return', data));
    
    
    
                    })
    
    
    
                }
    
            }
    
        })
    
    
    
    
    
    
    
        /////Api event handler
        Api.SetEventHandler(function (EventType, EventData) {
    
            /////Script started
            if (EventType == "start") {
            }
    
            /////Script stopped
            if (EventType == "stop") {
            }
    
            /////More events: https://wiki.bablosoft.com/web-interface/#/managingscriptlifetime
    
        })
    
        /////Automatically start script https://wiki.bablosoft.com/web-interface/#/managingscriptlifetime?id=method-acceptresources
        Api.AcceptResources(true)
    
    
        /////After everything is initialized may show body
        $("body").fadeIn()
    
        /////Events
    
    });
    
    /////Resource values are obtained through this function when hitting run button, you can change it.
    /////For example, you can edit value entered by user, make custom validation, or replace resource system compleatelly
    /////More info: https://wiki.bablosoft.com/web-interface/#/managingscriptlifetime?id=method-acceptresources
    function GetResourceValue(ResourceName) {
        return ""
    }
    
    
    //Interface editor has no connection to BAS and therefore can't execute BAS functions. 
    //If you try to call function from interface editor, 
    //you will get a random string as result in a several seconds. 
    //This behavior is not acceptable in several cases: if your function return a list, 
    //not a string, or string in specific format, if you want to test error handling, etc. 
    //In order to circumvent this limitation. you need to define "EmulateFunctionRun" 
    //function inside web interface.
    //More info: https://wiki.bablosoft.com/web-interface/#/callbasfunction?id=debugging-bas-function-call
    
    function EmulateFunctionRun(FunctionName, FunctionParameters, Resolve, Reject) {
        //Generate random data
        var RandomTime = Math.floor(Math.random() * (5000 - 3000)) + 3000
        var RandomResult = Math.floor(Math.random() * (1000))
    
        //Return result in RandomTime milliseconds
        setTimeout(function () {
            //Generate result string
            Resolve("Test result " + RandomResult)
        }, RandomTime)
    
    }
    


  • @hustler35 said in Как реализовать вызов функций в кастомном интерфейсе:

    @Fox спасибо, немного помогли твои светы, но пока только получается сделать чтобы они все разом открывались и возвращали результат, я не заню как ограничить кол-во одновременно работающиех потоков.

    Эмм, ну тут вроде же всё очевидно? После метода Api.GetTasks() вы получаете массив, считаете количество элементов в массиве и запускаете нужное количество оставшихся потоков.

    Моего опыта в программировании не хватает такое реализовать.

    Это ваш первый опыт работы с vue? Хранить данные value проще всего в массиве, ну или объекте, что бы проще было потом с этими строками работать.

    Асинхронными нужно создавать функции, только если используешь в них await или then, то есть если необходима работа с промисами. У вас в обоих методах нет ни одного

    Я думаю многим кто сталкнется с этим, было бы интересно знать

    Мой вам совет - не используйте ни когда это выражение, подобное обобщение вызывает только негативный эффект



  • @Fox Спасибо, попробую так сделать. Да, vue только изучаю. А про выражение которое написал, про то что многим будет интересно, я согласен с вами. Не знаю почему написал, чтобы наверное помощь получить:)

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

    Но почему то не получалось. Этот модуль возращал результаты функци исходя из параметра "сколько одноврменно потоков должно работать. Если я ставил 5 потоков одновремено и запускал асинхронную функцию 10 раз, то только у 5 приходил результат. а остальные 5 вызвращали null. Хотя когда работал со стандартным интерфейсом BASa все работало как надо.



  • @hustler35 said in Как реализовать вызов функций в кастомном интерфейсе:

    @Fox Спасибо, попробую так сделать. Да, vue только изучаю. А про выражение которое написал, про то что многим будет интересно, я согласен с вами. Не знаю почему написал, чтобы наверное помощь получить:)

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

    Но почему то не получалось. Этот модуль возращал результаты функци исходя из параметра "сколько одноврменно потоков должно работать. Если я ставил 5 потоков одновремено и запускал асинхронную функцию 10 раз, то только у 5 приходил результат. а остальные 5 вызвращали null. Хотя когда работал со стандартным интерфейсом BASa все работало как надо.

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

    Object.keys(Api.GetTasks()).length
    

    берём нужное нам число одновременно работающих функций 10 и вычитаем

    var count = Object.keys(Api.GetTasks()).length
    var permittedNumber = 10 - count
    

    далее используем полученное число в цикле запуска новых функций

    for(var i = 0; i < permittedNumber; i++){
       Api.RunFunction("LoadUrl", {Url: "ip.bablosoft.com"})
    }
    

    Просто застрял на этой реализции асинхронного вызова, 3 дня голову ломаю.

    Кстати интересно почему именно 3? Почему то подавляющее количество пользователей, которые описывают проблему пишут, что мучались с ней 3 дня. Или это как притча какая то - ... и мучался мОлодец с задачей три дня и три ночи, и на третий день пошёл на форум слово молвить...



  • @Fox Не знаю, может так память работает у людей. Но я правда 3 дня или даже 4 сижу изучаю api bas и вот с реализацией этого функционала застрял точно на дня 3. Просто еще слабые знания js сказываются. Спасибо за ответы и советы



  • @Fox said in Как реализовать вызов функций в кастомном интерфейсе:

    Кстати интересно почему именно 3?

    1 день. Запланировать.
    2 день. Попробовать выполнить запланированное.
    3 день. Попытаться понять почему не работает.
    4 день. Пишем что бас не работает.



  • @hustler35 Можно просто отслеживать событие завершения потока thread_end и запускать новый



  • @UserTrue а если количество задач станет меньше чем допустимых потоков?



  • @UserTrue Спасибо, вот именно в этом у меня был затык, не понимал как запустить дополнительные когда происходит закрытие предыдущих. Вроде всю документацию по API прочитал несколько раз, но почему то этот момент упустил:)



  • Спасибо всем, кто отозвался и помог:)


Log in to reply