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

Angular SignalStore:如何合并两个API返回的数组并按索引访问?

问题:Angular SignalStore合并数组状态实现按索引访问数据?

现有一个Angular SignalStore,包含两个数组状态与两个API调用,能否将这两个数组合并为一个数组,通过合并数组[0]、合并数组[1]的方式访问两个API返回的数据?

代码示例:

export const AktuellerMonatStore = signalStore(
  withState(monatGesamt),
  withRequestStatus(),
  withMethods((store, dbService = inject(DBService)) => ({
    loadDaten: rxMethod<void>(
      pipe(
        switchMap(() => {
          patchState(store, setPending());
          return dbService.getMonatGesamt('' + aktJahr + '', '' + monat + '').pipe(
            tapResponse({
              next: (pvVorjahr) =>
                patchState(store, { pvVorjahr }, setFulFilled()),
              error: (error: {"message":string}) => {
                patchState(store, setError(error.message));
              }
            })
          )
        })
      )
    ),
    loadDatenVorjahr: rxMethod<void>(
      pipe(
        switchMap(() => {
          patchState(store, setPending());
          return dbService.getMonatGesamt('' + aktJahr + '', '' + monat + '').pipe(
            tapResponse({
              next: (pvVormonat) =>
                patchState(store, { pvVormonat }, setFulFilled()),
              error: (error: {"message":string}) => {
                patchState(store, setError(error.message));
              }
            })
          )
        })
      )
    )
  }))

解答

完全可以实现,只需调整状态结构和API回调的状态更新逻辑,具体步骤如下:

  1. 修改初始状态结构
    将原来的两个独立数组状态(pvVorjahr、pvVormonat)替换为一个数组状态,比如命名为mergedData,初始值设为空数组:
// 替换原monatGesamt结构,假设原结构包含两个数组字段
const monatGesamt = {
  mergedData: [] as YourDataType[][] // 将YourDataType替换为实际数据类型
};
  1. 更新方法中的状态逻辑
    在两个rxMethod的next回调里,不再单独更新两个状态字段,而是根据索引更新mergedData数组的对应位置,注意保持数组的不可变性:
export const AktuellerMonatStore = signalStore(
  withState(monatGesamt),
  withRequestStatus(),
  withMethods((store, dbService = inject(DBService)) => ({
    loadDaten: rxMethod<void>(
      pipe(
        switchMap(() => {
          patchState(store, setPending());
          return dbService.getMonatGesamt('' + aktJahr + '', '' + monat + '').pipe(
            tapResponse({
              next: (data) => {
                // 更新mergedData的第0位,保留已有数据
                patchState(store, {
                  mergedData: [data, ...store.mergedData().slice(1)]
                }, setFulFilled());
              },
              error: (error: {"message":string}) => {
                patchState(store, setError(error.message));
              }
            })
          )
        })
      )
    ),
    loadDatenVorjahr: rxMethod<void>(
      pipe(
        switchMap(() => {
          patchState(store, setPending());
          return dbService.getMonatGesamt('' + aktJahr + '', '' + monat + '').pipe(
            tapResponse({
              next: (data) => {
                // 更新mergedData的第1位,保留已有数据
                const currentData = store.mergedData();
                patchState(store, {
                  mergedData: [currentData[0] || [], data]
                }, setFulFilled());
              },
              error: (error: {"message":string}) => {
                patchState(store, setError(error.message));
              }
            })
          )
        })
      )
    )
  }))
  1. 访问合并后的数据
    之后就可以通过索引直接访问对应API返回的数据:
// 获取第一个API(loadDaten)返回的数据
const firstApiData = store.mergedData()[0];
// 获取第二个API(loadDatenVorjahr)返回的数据
const secondApiData = store.mergedData()[1];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:25:46