Observable.empty()的行为

时间:2017-12-13 18:02:51

标签: angular rxjs

考虑以下代码:

interface MyObject {
  a: string, 
  b: string
}

@Component({
  selector: 'hello',
  template: `<h1>Hello {{name}}!</h1>`,
  styles: [`h1 { font-family: Lato; }`]
})

export class HelloComponent implements OnInit, AfterViewInit  {
  @Input() name: string;

  o: MyObject;

  constructor(private parent: AppComponent) {
  }

  ngOnInit() {
    this.getObject(5)
      .pipe(
        filter(Boolean),  // removing this causes an error
        catchError(err => {
          console.log(err);
          return Observable.empty();
        })
      ).subscribe(obj => {
        this.o = obj;        

        console.log(obj);
      });
  }

  getObject(id: number): Observable<MyObject> {
    if (id && typeof id !== 'undefined') {
      let obj: MyObject = { a: 'x', b: 'y'};

      return Observable.of(obj);
    }

    return Observable.empty();
  }


}

方法getObject返回一个MyObject类型的Observable或一个空的observable。我认为当你返回一个空的observable时,.subscribe不会被调用,因为它立即完成并且没有要订阅的元素。

然而,我收到错误:

输入&#39; {} |为MyObject&#39;不能分配给&#39; MyObject&#39;。   输入&#39; {}&#39;不能分配给&#39; MyObject&#39;。

如果我添加过滤器(布尔值),则错误消失。因为我没有返回Observable.of({}),所以我很困惑为什么会收到此错误消息。

1 个答案:

答案 0 :(得分:1)

  

我认为当你返回一个空的observable时,.subscribe不会被调用,因为它立即完成并且没有要订阅的元素。

它立即完成,但subscribe仍然执行 - 因为你马上执行它。您的next处理程序将永远不会被调用。这是一个很好的区别。但是,这与此问题无关。

  

然而,我收到一个错误:[...]

这是来自Typescript编译器的静态类型检查。您只需要正确键入空的observable:

return Observable.empty<MyObject>();
相关问题