是否可以通过ngrx createSelector发出错误?

问题描述 投票:0回答:1

也许有另一种解决方法(例如专门为错误创建另一个选择器)。

export const getMSFState = createFeatureSelector<STState>('st');
export const selectCreatedSensor = createSelector(
    getMSFState,
    selectAllSensors,
    (state: STState, sensorArray: SeasonTotals[], props: { blockId: number}) => {
        const isSuccessCreate = state.action === fromST.ST_ADD_ELEMENT && !state.loading && !state.error;
        const isAnErrorCreate = state.action === fromST.ST_ADD_ELEMENT && !state.loading && state.error;
        if (isAnErrorCreate) {
            return throwError('Error X');
        }
        const blockSensors = [...sensorArray].filter(s => s.blockId = props.blockId);
        return isSuccessCreate ? blockSensors.pop() : null;
    }
);

我想捕获第二个订阅参数(错误一个),但是我不知道是否可以在ngrx选择器中发出它

this.store.pipe(
    select(STSelectors.selectCreatedSensor, { blockId: this.id })
).subscribe((data) =>  {
    console.log('success creation', data);
}, (error) => {
    // I can't catch this, instead I catch it in the first subscribe parameter (in the success one)
    // And the value emited is an Observable object
    console.log('something went wrong', error); 
})
angular rxjs ngrx ngrx-entity
1个回答
0
投票

选择器总是返回有关state当前store而不是stream的部分信息。

[throwErrorobservable流返回错误,因此您无法返回实际状态。

...基本上将发生的是,当选择器中的Observable<Observable<Error>>函数返回时,您将得到类似throwError的东西,因此这将不起作用。

...

首先:您使用商店有误,应该:

  • 发送getData事件
  • 如果发生错误:getDataError事件
  • 如果成功发生getDataSuccess事件

我的方法是创建一个独占的loadingSelector loadedSelectorerrorSelector将数据加载包装在servicefacade或任何您想调用的位置,然后在其中进行错误处理,以便您可以订阅正确地放在您的组件中:

getData(): Observable<MyData> {
   return this.store.select(selector.loaded)
     .pipe(
       switchMap(loaded => {
          if (loaded) {
             return this.store.select(selector.myData);
          }
          this.store.dispatch(loadingAction);
          return this.store.select(selector.loading)
       })
       filter(loading => !loading),
       switchMapTo(this.store.select(selector.error)),
       switchMap(error => { 
          if (error) {
            return throwError(error);
          }
          return this.store.select(selector.myData);
       })
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.