Результат switchMap из углового хранилища Redux

#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 );  

Смысл оператора более высокого порядка заключается в том, что он управляет подписками для вас, и именно так вы избегаете вложенных подписок (и избегаете целого класса возможных ошибок). Здесь вы заметите, что вам нужно подписаться только один раз.