代码之家  ›  专栏  ›  技术社区  ›  Pedro Arantes

将一个可观测数据与另一个映射的最佳方法

  •  1
  • Pedro Arantes  · 技术社区  · 6 年前

    我在一个角度项目中工作,我有一个可观察到的 A 一个 从HTTP请求中发出一个值,我希望根据用户角色(admin、superuser和user)使用另一个可观察值过滤该值。我用 switchMap 如果有,但我认为还有更好的办法。我的解决方案是:

    getObervableA.pipe(
        switchMap(itens => {
            function filterItens(allowedItens) {
                return itens.filter(item => {
                    return allowedItens.some(({id}) => id === item.id);
                });
            }
    
            if (isAdmin) {
                return of(itens);
            } else if (isSuperuser) {
                getSuperuserAllowedItens.pipe(map(allowedItens => filterItens(allowedItens)));
            } else {
                getUserAllowedItens.pipe(map(allowedItens => filterItens(allowedItens)));
            }
        }),
    ).subscribe(
        // do something with A filtered
    )
    

    切换图 ...

    谢谢您!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nico    6 年前

    与其使用if/else,不如为这些类型的用例组合您的观察结果。 它允许更好的可读性和更容易测试

    filter &安培; merge 所以像这样:

     function filterItens(allowedItens, itens) {
          return itens.filter(item => {
            return allowedItens.some(({ id }) => id === item.id);
          });
        }
    
       admin$ = source.pipe(filter(() => isAdmin));
       superUser$ = source.pipe(filter(() => isSuperUser), mergeMap((itens) => getSuperuserAllowedItens.pipe(map(allowedItens => filterItens(allowedItens, itens))))
       user$ = source.pipe(filter(() => !isAdmin && !isSuperUser), mergeMap((itens) => getUserAllowedItens.pipe(map(allowedItens => filterItens(allowedItens, itens))))
       getObervableA.pipe(merge(admin$, superUser$, user$)).subscribe()
    
        2
  •  1
  •   CozyAzure    6 年前

    Observables 彼此独立, forkJoin 是非常有用的,并且可以更有效地:

    forkJoin(getObservableA, getSuperuserAllowedItens, getUserAllowedItens)
        .pipe(map(([itens, superuserItens, userItens]) => {
    
            if (isAdmin) {
                return itens;
            }
    
            if (isSuperUser) {
                return itens.filter(item => superuserItens.some(({id}) => id === item.id));
            }
    
            return itens.filter(item => userItens.some(({id}) => id === item.id));
        }))
    

    这是带有三元运算符的一行(几乎):

    forkJoin(getObservableA, getSuperuserAllowedItens, getUserAllowedItens)
        .pipe(map(([itens, superuserItens, userItens]) => {
            return isAdmin ? itens :
                isSuperUser ? itens.filter(item => superuserItens.some(({id}) => id === item.id)) :
                    itens.filter(item => userItens.some(({id}) => id === item.id))
        }))
    

    forkJoin(getObservableA, getSuperuserAllowedItens, getUserAllowedItens)
        .pipe(map(([itens, superuserItens, userItens]) => {
            return itens.filter(item => {
                return isAdmin || superuserItens.some(({id}) => id === item.id) || userItens.some(({id}) => id === item.id)
            })
        }))