Насколько мне известно, текущий 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();
}
}
}));
}
});
}