首页 > 解决方案 > RxJS:Forkjoin 类实例属性

问题描述

据我所知,forkJoin如果给定一个类实例,RxJS 附带的当前运算符会失败,因为函数不是 Observables。

我自己编写了一个 forkJoin 的替代版本,Object.keys(instance)用于确定此类实例的哪些部分必须被分叉连接。

虽然这工作得很好,但我想知道是否没有任何方法可以使用原生 RxJS 运算符实现相同的结果?

编辑: 按照建议,我将在下面发布我的源代码。

export function forkJoinProperties<ObjectLike extends object>(object: ObjectLike) : Observable<ObjectLike> | null
{
    // Check validity
    if(!UTIL.isObject(object))
    {
        console.error(`@UTIL.forkJoinProperties(): Given parameter ${object} is not an object!`);
        return null;
    }

    const propertyKeys: string[] = Object.keys(object);
    const resolvedPropertyValues: any[] = new Array(propertyKeys.length).fill(undefined);
    let resolvedPropertiesCount: number = 0;

    return new Observable(subscriber =>
    {
        for(let i = 0; i < propertyKeys.length; ++i)
        {
            const propertyObservable: Observable<any> = from(object[propertyKeys[i]]);

            subscriber.add(propertyObservable.subscribe(
            {
                next: value => resolvedPropertyValues[i] = value,
                error: error => subscriber.error(error),
                complete: () =>
                {
                    // Check if this is the last property to resolve it's observable
                    if(++resolvedPropertiesCount == propertyKeys.length)
                    {
                        // Save resolved property values to corresponding keys
                        for(let n = 0; n < propertyKeys.length; ++n)
                            object[propertyKeys[n]] = resolvedPropertyValues[n];

                        // Return object with resolved properties
                        subscriber.next(object);
                        subscriber.complete();
                    }
                }
            }));
        }
    });
}

标签: javascripttypescriptrxjsobservablefork-join

解决方案


推荐阅读