Как я могу использовать наблюдаемое для выполнения рекурсивного поиска, не просматривая дубликаты? - PullRequest
0 голосов
/ 13 декабря 2018

Я собираюсь сформулировать вопрос в rxjs, но я полагаю, что он похож на любую Rx или наблюдаемую библиотеку.

Скажем, у меня есть наблюдаемое пользователей и функция getAssociates(user), которая возвращает другую наблюдаемуюпользователей.Я хочу использовать функцию getAssociates для каждого пользователя в наблюдаемой и вернуть наблюдаемую из этих партнеров.flatMap достаточно для этого.

Но я также хочу запускать getAssociates для каждого возвращаемого сотрудника, но никогда не запускать его дважды для любого конкретного пользователя (поскольку два пользователя могут совместно использовать сотрудника, иесли A имеет B в качестве ассоциированного, то B также имеет A в качестве ассоциированного).

Что-то вроде оператора expand - это то, что я ищу:

seedUsers.pipe( expand(user => getAssociates(user)), );

но как я могу рассказать о том, что не нужно дважды запускаться на каком-либо конкретном пользователе?Я мог бы вести список увиденных пользователей, но хотел бы добиться его в функциональном стиле.

1 Ответ

0 голосов
/ 13 декабря 2018

Концептуально вам необходимо:

  • Отслеживать известных пользователей, например, используя Set
  • Фильтровать известных пользователей перед выполнением запроса, например, используяfilter operator

Вот предложение:

let knownIds = new Set();

getAllItems(Ids){
   return from(Ids).pipe(
     filter(id => ! knownIds.has(id)),
     concatMap(id => getAllItems(id)),
     map( id => knownIds.add(id))
   )
}

getAllItems([originalId]).subscribe( allItems=> console.log)

Примечания:

  • Я полагаю, вы могли бы сделать это, используяrxjs, но ни одно из решений, которые я могу придумать, не является более простым, чем использование set + filter.

  • Я использовал concatMap, чтобы не выполнять запрос дважды.Используя mergeMap (flatMap), вы можете создать такой сценарий:

--------- Req (user1) ---------------------------- resp (user1) -------------------------

--- Req (user2) -------- соответственно (user2) - Req (user1) ----------------- соответственно (user1) -

Но если вы в конечном итоге принимаете более 2 запросов на пользователя, вы можете использовать flatMap для увеличения скорости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...