Skip to content

Record (Запросы API) / Взаимствование ​

Особенности: Не поддерживает SSR

В Nuxoblivius предусмотрен механизм оптимизации запросов — взаимствование данных (borrowing). Он позволяет сократить количество обращений к API, повторно используя уже загруженные данные из других запросов.

Почему это может пригодиться?

Например, если у вас есть список новостей, и вы хотите получить конкретную новость по ID, фреймворк сначала попробует взять её из уже загруженного списка. Если данные найдены — новый запрос не выполняется.

Алгоритм работы (Mermaid):

null

Как использовать взаимствование между Record? ​

Чтобы включить механизм взаимствования, используется метод .borrowFrom(). Он позволяет задать условие, при котором текущий запрос будет пытаться взять данные у другого Record, вместо того чтобы выполнять новый запрос.


Метод принимает три аргумента:

  1. Условие включения — когда именно нужно пытаться использовать взаимствование.
  2. Функция получения данных — получает данные из другого запроса.
  3. Функция проверка — возвращает найденные подходящие данные (если не нашли возвращаем null).
ts
import { Record } from "nuxoblivius";

const getAllPosts = Record.new("/api/posts", []);
const getPostById = Record.new("/api/posts/{id}", {});

getPostById.borrowFrom(
  ({ path, query }) => true, // Всегда искать
  () => getAllPosts.response, // Получаем данные о всех постах
  (allPostItem, { path, query }) =>
    allPostItem.id == path.id ? allPostItem : null, // Ищем по id
);

В итоге

Если подходящие данные будут найдены — Record вернёт их, и запрос к API не выполнится. Иначе — выполнится стандартный запрос.


Детальный разбор:

  1. Условие включение:

    Первый аргумент метода .borrowFrom() отвечает за то, когда именно включать взаимствование. Это функция, которая получает объект с параметрами текущего запроса:

    ts
    ({ path, query }) => true;
    • path — объект с текущими path-параметрахпараметрами;
    • query — объект с текущими query-параметрами.

    Функция должна вернуть true или false. Таким образом, вы можете гибко контролировать ситуации, когда взаимствование полезно, а когда его лучше отключить.

    В данном примере, взаимствование будет всегда отрабатывать

  2. Функция получения данных:

    Второй аргумент метода .borrowFrom(), указывает откуда нужно взять данные которые мы будем взаимствовать

    ts
    () => getAllPosts.response;

    Мы не ограниченны использованием Record, можно использовать любой источник данных.

    В данном примере, мы берём данные у getAllPosts

  3. Функция проверка:

    Третий аргумент метода .borrowFrom() отвечает за поиск подходящих данных среди уже загруженных. Если функция находит совпадение — оно возвращается и запрос к API не выполняется. Если совпадения нет — выполняется обычный запрос.

    Функция получает два аргумента:

    • item — элемент массива (например, объект поста).
    • Контекст запроса — объект с path и query параметрами, которые можно использовать для проверки.

    Пример:

    ts
    (postItem, { path, query }) => {
      if (postItem.id == path.id) {
        return postItem;
      }
    };

    В этом случае, если id поста из массива совпадает с id в path-параметрах — возвращается найденный объект. Иначе запрос продолжит выполнение как обычно.

Особенности взаимствования ​

Механизм взаимствования в Nuxoblivius можно гибко настраивать.

1. Управление очисткой response. ​

Вы можете выбрать, когда именно очищать данные:

  • greedy Сразу при запуске запроса — response очищается до попытки взаимствования.
  • lazy Только если взаимствование не сработало — данные сохраняются, пока не станет ясно, что запрос всё же нужно отправлять.

см. также swapMethod

2. Взаимствование как кэширование ​

Если вам нужна собственная система кэширования, взаимствование может использоваться как её основа. Вы можете сохранять результаты предыдущих запросов и подменять ими новые.

3. Цепочка взаимствований ​

Каждый вызов .borrowFrom() добавляет обработчик в стек. Это значит, что можно настроить несколько источников данных для взаимствования, и они будут проверяться последовательно, пока один из них не вернёт результат.

Синтаксический сахар ​

У метода .borrowFrom(), в параметре Условие включения, доступен упрощённый синтаксис. Вместо написания длинных функций можно использовать объект с короткими проверками:

  • * — данные существуют (эквивалент !== null).
  • null — данные не установлены (эквивалент === null).
  • Любое значение — данные равны этому значению (эквивалент == <значение>).
ts
import { Record } from "nuxoblivius";

const getAllPosts = Record.new("/api/posts", []);
const getPostById = Record.new("/api/posts/{id}", {});

// Пусть взаимствование, работает только когда path-параметр `id` не равен null
getPostById.borrowFrom(
  ({ path, query }) => path.id !== null, 
  { id: "*" }, 
  ...
);

2023-2025 Power tool for creating project with Enjoy!