typescript 如何在.map()函数中获取可观察值

mfuanj7w  于 2022-12-05  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

我有一个函数**_populateData**,它从另一个属性列表创建一个新的属性列表。
有一个可观察的getOwnerForProperty返回所有者的值。

//Get single owner observable
public getOwnerForProperty(prop: any){
    return this._manageOwnerService._getOwnersOfProperty(prop).pipe(map(o => o[0]))

如何从**.map()函数中调用可观察对象,以获取可观察对象的值并将其附加到新对象,如下所示?在我看来,在.map()中订阅getOwnerForProperty**函数不是一个好主意。请给出实现以下最佳实践的最佳方法。

/**
 * Returns the active properties data.
 * 
 * @param props - The property list.
 * @returns An array of properties 
 */
private _populateData(props: Property[]) {
    return
    const populated = props
        .filter(prop => !prop.isArchived)
        .map((p: Property) => {
            // refactoring here
            this.getOwnerForProperty(p).pipe(
                map((owner: Owner) => {
                    const obj = {
                        propertyName: p.info.name.toUpperCase(),
                        owner: owner.name,
                        createdOn: p.createdOn ? __FormatDateFromStorage(p.createdOn) : ''
                    } 
                    return obj;
                })
               
            )
            

        }
    )
    return populated;
}
}
wi3ka0sx

wi3ka0sx1#

从你的问题来看,你并不完全清楚你到底想达到什么目的,但我的解决方案是这样的,所以你很有希望得到这个想法:
1.筛选您要“丰富”的属性。
1.使用forkJoin创建一个可观测量值数组,并等待所有可观测量值完成。
1.将每个属性Map到要等待的可观察对象。
1.将可观察结果Map到初始属性,并使用owner对象丰富它。

  1. forkJoin返回一个可观察对象,它基本上会发出一个丰富对象的数组并完成。如果你想将它await,你可以将它 Package 在lastValueFrom运算符中,比如await lastValueFrom(forkJoin(...))
function _populateData(props: Property[]) {
  const propertiesToPopulate = props.filter((prop) => !prop.isArchived);

  forkJoin(
    propertiesToPopulate.map((p: Property) => {
      return getOwnerForProperty(p).pipe(
        map((owner) => ({
          ...p,
          owner,
        }))
      );
    })
  );
}

相关问题