Appearance
Records Caching ^ 1.1.0
Для одного Record
-а может быть вызвана функция получения данных (GET, POST, [функции пагинации]/(/release/records.html#пагинация), и т.д.) многократно (причём с различными path-параметрами, в том числе может и без параметров).
Response (если не активна функция appendsResponse) хранит в себе (что логично) лишь последнее полученное значение с API.
При этом предыдущие значения не стираются с памяти, а сохраняются в кэше
. Кэш хранит в себе данные в виде пар "тег: response" - т.е. к каждому respons-у сооветствует тег
в качестве идентификатора.
При необходимости сборки кэша теги нужно настроить функцией createTag
:
createTag
ts
const article = Record.new<IArticle>('/api/article/{id}')
.createTag('path:id', 'full') // Определение тегов для данного Record
// Теги по path-параметру. Т.е. id (часть после двоеточия 1-го аргумента) будет браться из path-параметра (часть перед двоеточием).
// `full` - означает, что запись в кэше будет сохраняться для каждого уникального значения тега 'path:id'
// Или:
const article = Record.new<IArticle>('/api/article/{id}')
.createTag('path:id', 'simply') // Определение тегов для данного Record
// `simply` - означает, что записи для кэша будут сохраняться по принципу "был указан параметр, или нет". Т.е. будут сохранены 2 записи.
// Или:
const articles = Record.new<IArticle>('/api/article')
.createTag('query:page', 'full') // Определение тегов для данного Record
// Теги по query-параметру 'page'.
// `full` - будут идентифицироваться все записи для каждого конкретного 'query:page'
1-й аргумент функции - строка вида path:${somePathParam}
либо query:${someQueryParam}
. Часть перед двоеточием определяет, записи будут кэшироваться по path-параметру, или же по query-параметру (2 варианта). Часть после двоеточия - название самого параметра.
2-й аргумент функции:
simply
(default) - при нём в кэше будут сохранены только 2 возможные записи по принципу: был ли указан данный параметр, или же нет.full
- записи будут кэшироваться для каждого уникального значения указанного в 1-м аргументе параметра.
Для доступа непосредственно к данным из кэша используется функция cached
:
cached
ts
Articles.article.cached({id: 5}) // запись с тегом `id: 5` (id как из path-параметра, так и из query будут равнозначны)
Articles.article.cached({id: null}) // запись при неуказанном id
Articles.article.cached({id: '*'}) // последняя запись при каком-либо выставленном id, не равном null
Тут отметим, что при повторной записи данных в Record для одинакового тега, доступен будет только последний из них. Кэш сохраняет только последнюю запись для конкретного тега.
Для 3-го примера выше, к примеру, в кэше будет доступен только последний из всех response-ов для произвольных id.
Примеры использования
ts
class Articles {
const articles = Record.new<IArticle>('/api/article')
.createTag('query:page', 'full') // теги - query-параметры 'page'
// 'full' - сохраняем response каждой страницы (query:page)
}
await Articles.articles.query({page: 1}).get()
await Articles.articles.query({page: 2}).get()
await Articles.articles.query({page: 3}).get()
console.log(Articles.articles.cached({page: 1})) // доступна 1-я страница статей
console.log(Articles.articles.cached({page: 2})) // доступна 2-я страница статей
console.log(Articles.articles.cached({page: 3})) // 3-я (актуальная) страница статей
console.log(Articles.articles.response) // лог, аналогичный предыдущему
console.log(Articles.articles.cached({page: '*'})) // лог, также аналогичный двум предыдущим - последний response статей при любом указанном page
await Articles.articles.get() // не указали page
console.log(Articles.articles.cached({page: null})) // response статей при неуказанном page
console.log(Articles.articles.cached({page: '*'})) // лог, аналогичный первым 5-и: response статей при любом page, не равном null
console.log(Articles.articles.cached({page: 4})) // undefined
await Articles.articles.query({id: 5}).get() // снова указали page, но указали другой параметр
console.log(Articles.articles.cached({page: null})) // результат последнего запроса. Т.к. как раз в нём page не был указан (был указан другой параметр, id)
console.log(Articles.articles.cached({page: 5})) // undefined
ts
class Articles {
const article = Record.new<IArticle>('/api/article/{id}')
.createTag('path:id', 'simply') // теги - path-параметры 'id'
// 'simply' - сохраняем только 2 записи в кэше по принципу "Был ли выставлен 'path:slug', или нет"
}
await Articles.article.pathParam('id', 2).get()
await Articles.article.pathParam('id', 3).get()
await Articles.article.pathParam('id', 4).get()
console.log(Articles.articles.cached({id: 2}))
console.log(Articles.articles.cached({id: 3}))
console.log(Articles.articles.cached({id: 4}))
console.log(Articles.articles.cached({id: 5}))
console.log(Articles.articles.cached({id: '*'})) // все 5 вышеперечисленных лога вернут последний response при указанном любом id
console.log(Articles.articles.cached({id: null})) // undefined, т.к. запроса при НЕуказанном id не осуществлялось
await Articles.article.get() // не указали id
console.log(Articles.articles.cached({id: null})) // теперь данный лог вернёт результат последнего запроса - при нём id не был указан