Реактивное программирование - наблюдаемый кеш - PullRequest
0 голосов
/ 05 февраля 2020

Я довольно плохо знаком с реактивным программированием и наблюдаемыми, поэтому может быть очевидное решение, но, тем не менее, я просто не могу понять, как сделать этот простой сервис кэширования в javascript с наблюдаемыми

private legalIds: number[]
private personsCache: Person[] // Person has an id as a property

getPersons(ids: number[]) {
  const fromCache = personsCache.filter(p => ids.includes(p.id)) // Get the cached persons
  const newPersons = getPersons(ids.filter(id => legalIds.includes(id) && !fromCache.includes(id))) // Get the ones not already cached, if the ids are allowed

  return fromCache.concat(newPserons)
}

Как бы вы реализовали вышеописанную функциональность цепочки с помощью наблюдаемых? не требуется программирование хранения массивов et c.

1 Ответ

0 голосов
/ 14 февраля 2020

Я на самом деле не уверен насчет вашего внутреннего рекурсивного вызова getPersons (..). Но давайте представим, что это функция, которая просто возвращает вам людей относительно некоторых идентификаторов, и она не рекурсивная.

private legalIds$: Subject<number[]> = new Subject();
private personsCache$: Subject<Person[]> = new Subject();

getPersons$(ids: number[]) {
  const fromCache$ = personsCache$.pipe(
    map(personsCache => personsCache.filter(p => ids.includes(p.id))
  );

  const newPersons$ = legalIds$.pipe(
    map(legalIds => getPersons(ids.filter(id => legalIds.includes(id) && !fromCache.includes(id)))
  );

  return combineLatest([fromCache$, newPersons$]).pipe(
    map(([fromCache, newPersons]) => fromCache.concat(newPersons))
  );
}

- В большинстве случаев, если у вас есть / нужно рекурсивное поведение в синхронном программировании, вы можете решите это в rx с помощью scan, потому что это состояние

- Если бы я мог немного больше понять сценарий использования / сценарий, то не было бы необходимости требовать вызова getPersons $. Обычно вы также можете предоставить Observable (например, publi c people $), который использует ids $ Observable / Subject (который предоставляется вашей функцией getPersons).

...