#angular #redux #rxjs
#угловой #возвращение #rxjs
Вопрос:
У меня есть магазин redux, где я храню ряд ценностей, в данном случае партнеров, которые выглядят так:
partners: [ {id: 1, name: 'partner 1', partnerCode: 'ABC123', ... }, {id: 2, name: 'partner 2', partnerCode: 'CDE567', ...}, ...];
Я выбираю партнеров, используя:
this.store.select('partnerFunc').subscribe(data =gt; { this.partner = data.partners.find(t =gt; t.partnerId === this.id); });
Я хочу иметь возможность выполнять и действовать после того, как я получу результат, выполните вызов API на основе возвращенного кода партнера.
this.dataService.getUsers(partnerCode).subscribe(data =gt; { this.users = data; });
Я думаю, что мне нужно использовать switchMap, так как, как только у меня появится соответствующий партнер, которого я знаю, я давно хочу подписаться на магазин redux. Я перепробовал множество комбинаций и искал здесь повсюду, но, похоже, не могу понять формат.
Это лучшее, что я придумал, чтобы попытаться объяснить, что я пытаюсь сделать:
this.store.select('partnerFunc').pipe(switchMap(result =gt; { return result.partners.find(t =gt; t.partnerId === this.id); })).subscribe(value =gt; { this.dataService.getUsersForPartner(value.partnerId).subscribe(data =gt; { this.users = data; }) });
но результат в первой строке выдает ошибку, которая:
Argument of type '(result: State) =gt; IPartner' is not assignable to parameter of type '(value: State, index: number) =gt; ObservableInputlt;anygt;'.
Спасибо
Ответ №1:
Это мое лучшее предположение из того, что вы описали, и кода, который вы показали здесь:
this.store.select('partnerFunc').pipe( map(result =gt; result.partners.find(t =gt; t.partnerId === this.id) ), switchMap(({partnerId}) =gt; this.dataService.getUsersForPartner(partnerId) ) ).subscribe(data =gt; this.users = data );
Смысл оператора более высокого порядка заключается в том, что он управляет подписками для вас, и именно так вы избегаете вложенных подписок (и избегаете целого класса возможных ошибок). Здесь вы заметите, что вам нужно подписаться только один раз.