Rx JS: свойства экземпляра класса Forkjoin - PullRequest
0 голосов
/ 09 января 2020

Насколько мне известно, текущий forkJoin оператор, идущий с Rx JS, не работает, если ему дан экземпляр класса, из-за того, что функции не являются Observables.

Я написал альтернативу версия forkJoin, используя Object.keys(instance), чтобы определить, какие части такого экземпляра должны быть соединены вилкой.

Хотя это работает довольно хорошо, мне было интересно, нет ли способа достичь того же результата с собственными операторами Rx JS?

Редактировать: Как предложено, я опубликую свой исходный код ниже.

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();
                    }
                }
            }));
        }
    });
}
...