В виджетах и на формах приложений доступны два вида сценариев — клиентские и серверные.
Клиентские сценарии выполняются на стороне клиента, то есть все операции выполняются в браузере пользователя и не нагружают сервер. В клиентских сценариях доступно всё, что находится в HTML-коде страницы.
Серверные сценарии выполняются на сервере.
Запросы к серверу через TS SDK можно отправлять как из клиентских, так и из серверных сценариев. Здесь нет существенных различий.
Чтобы вызвать метод из серверных сценариев в клиентском сценарии, используйте конструкцию Server.rpc.серверная_функция():
Код:
// Серверный сценарий
async function myServerFunc(): Promise<void> {
const res = await fetch(Context.data.url)
if (!res.ok) {
return;
}
Context.data.json = await res.json();
}
// Клиентский сценарий
async function myClientFunc(): Promise<void> {
await Server.rpc.myServerFunc();
}
Для передачи аргументов между клиентом и сервером нельзя напрямую использовать параметры функций. Чтобы передать параметры в серверный сценарий, необходимо использовать контекст. Серверный сценарий забирает текущее состояние контекста, производит обработку и возвращает весь контекст целиком. Если во время работы вы поменяете контекст локально, то по завершении работы серверного сценария установленные значения пропадут.
Клиентский сценарий
Код:
async function myClientFunc(): Promise<void> {
Context.data.input_str = 'string';
Context.data.input_number = 123;
Context.data.input_bool = true;
// Обязательно указывайте await, если нужно дальше работать с результатом выполнения
await Server.rpc.myServerFunc()
// Здесь уже можно обращаться к переменной с результатом
if (Context.data.output_result) {
// Полезный код
}
}
Серверный сценарий
Код:
async function myServerFunc(): Promise<void> {
let body = {"str":"", "number":0 };
if (Context.data.input_bool) {
body.str = Context.data.input_str;
body.number = Context.data.input_number;
}
const res = await fetch(url, {})
if (!res.ok) {
return;
}
const json = await res.json();
Context.data.output_result = json.Result;
}