@Freethinker said in Как добавить */ (звездочка слэш) в переменную?:
Хмм, сам код отрабатывает в BAS также корректно, однако если добавить действие "Установить переменную", то это вызовет проблему. Надо посмотреть по внимательнее
Привет. Мне нужно реализовать вызов функций через 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 и запускать новый