Предположим, у меня есть функция GetUserRecommendedSongs
. Это делает следующее:
- Он предоставляет пользователю диалог: какое у вас настроение сегодня?
(Счастливый \ мрачная \ ностальгии)
- Используя результат, он вызывает сервис
GetUserRecommendationsByMood
.
- Затем возвращается результат, например:
{mood: "nostalgic", songIds:
[12, 25]}
;
- Вызывающий эту функцию (возможно, несколько компонентов пользовательского интерфейса) будет
используйте результат для воспроизведения песен под заголовком
"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, так как я не тестировал этот код)
Этот код довольно сложный. Можно ли это упростить?