使用rxjs/Subject返回数组的Observable(Observable.from vs. Observable.of)

3

我正在使用WebSockets与后端WebApi进行通信。一切都很好,除了我无法从我的服务中返回自定义对象。

我正在使用Angular 4.3.4和rxjs 5.4.3。

//ngInit from my component
ngOnInit() {
    this.modelsSubscription = this.mainService.getModels().subscribe(models => {
      this.models = models;
    });

//here's code from my service
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import { Subject } from 'rxjs/Subject';
import { environment } from '../../environments/environment';

import { WebsocketService } from './websocket.service';
import { MyModel} from '../models/my-Model';
import { ApplicationError } from '../globals/application-error';


@Injectable()
export class MainService {
  messages$: Observable<MyModel[]>;

  private messages: Subject<MyModel[]>;
  private webApiUrl: string;
  private wsApiUrl: string;

  constructor(private http: HttpClient, private wsService: WebsocketService) {
    this.webApiUrl = environment.webApiUrl + '/api/mainscreen/';
    this.wsApiUrl = this.webApiUrl.replace('http:', 'ws:');
  }

  disconnect() {
    this.wsService.disconnect();
  }

  getModels() {
    this.messages = <Subject<MyModel[]>>this.wsService
      .connect(`${this.wsApiUrl}GetModels`)
      .map((response: MessageEvent): Observable<MyModel[]> => {
        const data = JSON.parse(response.data);
        const myModels = MyModel.fromArray(data);
        // return Observable.from(myModels) // <-- throws error Type 'Observable<MyModel>' is not assignable to type 'Observable<MyModel[]>'
         // return myModels; // <-- throws error myModels[] is not assignable to Observable<myModels[]>
        return new Observable<MyModels[]>(observer => {
          observer.next(myModels); // <-- never gets called
          observer.complete();
        });
      })
      .catch((error: any) =>
        Observable.throw(new ApplicationError(error))
      );

    this.messages$ = this.messages.asObservable();
    return this.messages$;
  }    
}

我该如何从服务中返回Observable?

1个回答

2
如果您能提供一个Plunker,那会更容易些。到目前为止,我认为您混淆了Observable.from和Observable.of:
Observable.from
该操作符正在遍历数组元素并将其推送到Observable中。这就是为什么您会遇到类型兼容性问题的原因: http://reactivex.io/documentation/operators/from.html
Observable.of
此操作符从传递给它的参数创建Observable: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-of
总结一下。您应该更改:
return Observable.from(myModels)

to:

return Observable.of(myModels)

例子:

var myModels = ["a", "b", "c", "d"]
Observable.from(myModels).subscribe(value => console.log("value is: " + value));
Observable.of(myModels).subscribe(value => console.log("value is: " + value));

输出结果将是:

value is: a
value is: b
value is: c
value is: d
value is: [a, b, c, d]

您之前的建议正确,使用Observable.of解决了我的问题。但是,现在组件中ngOninit方法中的subscribe方法返回ScalarObservable。您知道我该如何导入ScalarObservable吗? - GamerDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接