@FastSpace подскажи, это какую функцию имеешь ввиду?
Условно говоря у меня идут действия от одного к другому.
Проверка существования элемента, если его не видно значит нужно выполнить клик по элементу
Если ошибка клика по элементу, т.к он не найден, ставить проверку существования элемента отвечающего за капчу?
Как реализовать вызов функций в кастомном интерфейсе
-
Привет. Мне нужно реализовать вызов функций через 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 said in Как реализовать вызов функций в кастомном интерфейсе:
Кстати интересно почему именно 3?
1 день. Запланировать.
2 день. Попробовать выполнить запланированное.
3 день. Попытаться понять почему не работает.
4 день. Пишем что бас не работает. -
@hustler35 Можно просто отслеживать событие завершения потока thread_end и запускать новый