Как реализовать вызов функций в кастомном интерфейсе
-
Привет. Мне нужно реализовать вызов функций через API чтобы их принцип работы был похож как в модуле BAS "Вызов асинхронной функции". Чтобы допустим у меня есть 10 строк для создания аккаунтов (см.скриншот). Нужно чтобы при нажатии на кнопку "Создать" я мог огранить количество одновременно работающих потоков. Может есть уже кого идеи?
-
@hustler35 said in Как реализовать вызов функций в кастомном интерфейсе:
Привет. Мне нужно реализовать вызов функций через API чтобы их принцип работы был похож как в модуле BAS "Вызов асинхронной функции". Чтобы допустим у меня есть 10 строк для создания аккаунтов (см.скриншот). Нужно чтобы при нажатии на кнопку "Создать" я мог огранить количество одновременно работающих потоков. Может есть уже кого идеи?
Ознакомьтесь с мануалом https://wiki.bablosoft.com/web-interface/#/callbasfunction
и при использовании await не обязательно использовать then
https://tproger.ru/translations/understanding-async-await-in-javascript/
-
@Fox спасибо, немного помогли твои светы, но пока только получается сделать чтобы они все разом открывались и возвращали результат, я не заню как ограничить кол-во одновременно работающиех потоков.
Моего опыта в программировании не хватает такое реализовать. Подскажи пожалуйста, как сделать такое. Я думаю многим кто сталкнется с этим, было бы интересно знать$(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 прочитал несколько раз, но почему то этот момент упустил:)
-
Спасибо всем, кто отозвался и помог:)