RXJS: присвоение, а затем повторное использование значения между операторами - PullRequest
0 голосов
/ 13 января 2019

Предположим, у меня есть функция GetUserRecommendedSongs. Это делает следующее:

  1. Он предоставляет пользователю диалог: какое у вас настроение сегодня? (Счастливый \ мрачная \ ностальгии)
  2. Используя результат, он вызывает сервис GetUserRecommendationsByMood.
  3. Затем возвращается результат, например: {mood: "nostalgic", songIds: [12, 25]};
  4. Вызывающий эту функцию (возможно, несколько компонентов пользовательского интерфейса) будет используйте результат для воспроизведения песен под заголовком "so you feel ${result.mood} today?"

Проблема в том, что я использую настроение дважды: чтобы получить рекомендации и в конечном результате.

С async\await Я бы сделал:

const requiredMood = await ShowRequiredMoodDialog();
//handle cancellation e.g. if(!mood)
let recommendedSongs = await GetUserRecommendations(mood);
return {mood, recommendedSongs};

Однако с помощью rxjs я смог придумать только следующее:

let mood$ = ShowRequiredMoodDialog().pipe(share) //has to be shared so we don't show the dialog twice
let recommendedSongs$ = mood$.pipe(switchMap((mood)=> GetUserRecommendations(mood)));
return forkJoin(mood$, recommendedSongs$) //with some selector\map to turn into object

(примечание для читателя: не используйте это как ссылку на rxjs, так как я не тестировал этот код)

Этот код довольно сложный. Можно ли это упростить?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

А как насчет этого?

let mood$ = ShowRequiredMoodDialog().pipe(share());
let recommend = (mood) => {
  return { mood, songs: GetUserRecommendations(mood) };
};
let recommendedSongs$ = mood$.pipe(switchMap(recommend));
return recommendedSongs$;
0 голосов
/ 13 января 2019

Единственный другой способ, который приходит мне в голову, такой, но я не знаю, какой из них более читабелен:

mood$.pipe(
  switchMap(mood => GetUserRecommendations(mood).pipe(
    map(recommendedSongs => [mood, recommendedSongs]),
  ),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...