-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask2_ru.js
More file actions
43 lines (37 loc) · 2.37 KB
/
task2_ru.js
File metadata and controls
43 lines (37 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// субъективную оценку сложности 3/10
// предварительную оценку трудозатрат 50 мин
// фактические трудозатраты - 45 мин
// оценка сложности - O(1+K) где K - количество isins (isins.join(',') в коде). Такая сложность чисто из-за ограничения maxCacheSize. В противном случае были бы проблемы памяти.
// P.S. - не уточняется место хранение кеша, для простоты использую объект. Не уточняется как реализовать, сделал просто по прошлым запросам. (посложнее если запоминаем комбинацию date и isins и запрашиваем только недостающие isins) добавил ограничение размера кеша в функцию
const getBondsData = async ({ date, isins }) => {
// Все эти данные, лучше вынести во вне. Но в ТЗ изминать код функции =)
if (getBondsData.cache === undefined) {
getBondsData.cache = {} // Кэш для хранения результатов
getBondsData.keys = [] // Массив для отслеживания порядка ключей
getBondsData.maxCacheSize = 10 // Максимальный размер кэша
}
// Ключ для хранения в кэше
const cacheKey = `${date}-${isins.join(',')}`
// Попытка получить данные из кэша
if (getBondsData.cache[cacheKey]) return getBondsData.cache[cacheKey]
// Если данных в кэше нет, делаем запрос
const result = await http.post({
url: `/bonds/${date}`,
body: isins,
})
// Добавляем результат в кэш
getBondsData.cache[cacheKey] = result
getBondsData.keys.push(cacheKey)
// Проверяем размер кэша
if (getBondsData.keys.length > getBondsData.maxCacheSize) {
// Удаляем самый старый ключ и данные из кэша
const oldestKey = getBondsData.keys.shift()
delete getBondsData.cache[oldestKey]
}
return result
}
// Пример вызова функции:
getBondsData({
date: '20180120',
isins: ['XS0971721963', 'RU000A0JU4L3'],
})