将数组转换为Observable <T []>

时间:2019-07-15 02:58:10

标签: javascript angular

我想将数组转换为类型Observable<T[]>,并使用了rxjs方法“ from”。但是它返回Observable<T>,有没有办法将数组转换为Observable<T[]>

Player: Observable<T[]>;

convert(){
let tempArr:T[] = Object.values(data) as T[];
let Obsobj = from(tempArr);
this.Player = Obsobj;
}

这是我收到的错误消息, Observable<T>不可分配为类型Observable<T[]>

编辑

即使使用以下代码段返回类型也不是预期的。

let $sub = new Subject<Array<T>>();
$sub.next(tempArr);
this.Player$ = $sub.asObservable();

由于我希望返回的可观察类型如下。

Observable {_isScalar: false, source: Observable, operator: MapOperator}

,但返回了以下内容。

Observable {_isScalar: false, source: Subject}

编辑#2

完整的代码段。

Player: Observable<B[]>;

convert(data: Dictionary<B>){
   let tempArr:B[] = Object.values(data) as B[];
   let $sub = new Subject<Array<B>>();
   $sub.next(tempArr);
   this.Player$ = $sub.asObservable();
}

这是什么问题?有帮助吗?

3 个答案:

答案 0 :(得分:3)

可从文档中观察到: 对于数组和可迭代对象,所有包含的值将作为序列发出! 因此,您的项目将始终以T而不是T []的形式发出。

对于Observable<T[]>,请执行以下任一操作:

$sub = new Subject<Array<T>>();
this.Player = $sub.asObservable();

OR

this.Player = of(array);

OR

Observable.create((observer) => {observer.next(array)})

答案 1 :(得分:1)

使用of运算符代替from

import { of } from 'rxjs';
...

player: Observable<T[]>;

convert(){
  let tempArr:T[] = Object.values(data) as T[];
  let Obsobj = of(tempArr);
  this.Player = Obsobj;
}

答案 2 :(得分:1)

这不是generics的工作方式。

您必须重构代码才能使其正常工作。

理想情况下,您的convert方法应该使用通用类型T

类似这样的东西:

convert<T>(array: Array<T>): Observable<Array<T>> {
  return of(array);
}

当您致电convert时,您会这样称呼它:

this.convert<User>([{ firstName: `John`, lastName: `Doe` }])
  .subscribe((userArray: Array<User>) => console.log(userArray));

执行此操作时,您是在告诉convert函数将类型T设置为User类型。

这是一个完整的工作示例:

import { Component } from '@angular/core';
import { Observable, of } from 'rxjs';

interface User {
  firstName: string;
  lastName: string;
}

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  player: Observable<Array<User>>;

  ngOnInit() {
    this.convert<User>([{ firstName: `John`, lastName: `Doe` }])
      .subscribe((userArray: Array<User>) => console.log(userArray));
  }

  convert<T>(array: Array<T>): Observable<Array<T>> {
    return of(array);
  }
}