You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NGRx中提取GET响应对象内的ReceivingObject数组?

解决方案

首先,你需要先定义一个对应接口返回结构的类型,因为当前接口返回的是包含ReceivingObject数组的对象,而非直接返回数组:

// 新增响应结构接口
interface ReceivingResponse {
  receivingObject: ReceivingObject[];
}

然后修改service中的fetchAll方法,先获取完整响应对象,再通过map操作符提取内部的数组,这样就能返回Observable<ReceivingObject[]>类型:

// 修改后的service方法
fetchAll(): Observable<ReceivingObject[]> {
  return this.http.get<ReceivingResponse>(this.url).pipe(
    map(response => response.receivingObject), // 提取目标数组
    fetchDelay()
  );
}

接下来修正Effects代码里的错误:在map操作中应该派发fetchAllSuccess action,而非fetchAll:

// 修改后的Effects片段
fetchAll$ = createEffect(() =>
  this.actions.pipe(
    ofType(Actions.fetchAll),
    switchMap(() => {
      return this.service.fetchAll().pipe(
        map((receivingObject) => Actions.fetchAllSuccess({ receivingObject })), // 改为fetchAllSuccess
        catchError(mapAsFailure(Actions.failure))
      );
    })
  )
);

最后统一Reducer中的action名称(当前Reducer里的action名称和你定义的Actions不匹配):

// 修改后的Reducer代码
export const reducer = createReducer(
  initialState,
  on(Actions.fetchAll, (state) => ({ ...state, loading: true })), // 匹配Actions中的fetchAll
  on(Actions.fetchAllSuccess, (state, { receivingObject }) => { // 匹配Actions中的fetchAllSuccess
    return adapter.setAll(receivingObject, {
      ...state,
      loading: false,
      loaded: true,
    });
  })
);

完成以上修改后,service就能正确返回ReceivingObject[]类型的Observable,后续NGRx的数据流也能正常处理这个数组。

内容的提问来源于stack exchange,提问作者Lucindor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:12:27