从`Observable <array <number>&gt;`返回一个`number`

时间:2017-12-17 17:03:52

标签: angular rxjs

我在RxJS的教程中找到了这段代码。我是RxJs的新手。我有些疑惑。

代码似乎返回number,而observable似乎是Observable<Array<number>>类型(我想这意味着Observable应该返回Array<number>

问题1:是否可以从number返回Array<number>

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

@Component({
    selector: 'app',
    template: `
      <b>Angular 2 Component Using Observables!</b>


  <h6 style="margin-bottom: 0">VALUES:</h6>
  <div *ngFor="let value of values">- {{ value }}</div>

  <h6 style="margin-bottom: 0">ERRORs:</h6>
  <div>Errors: {{anyErrors}}</div>

  <h6 style="margin-bottom: 0">FINISHED:</h6>
  <div>Finished: {{ finished }}</div>

  <button style="margin-top: 2rem;" (click)="init()">Init</button>
`
})
export class MyApp {




 private data: Observable<Array<number>>;
  private values: Array<number> = [];
  private anyErrors: boolean;
  private finished: boolean;

  constructor() {
  }

  init() {
      this.data = new Observable(observer => {


     setTimeout(() => {
          observer.next(42);
      }, 1000);

      setTimeout(() => {
          observer.next(43);
      }, 2000);

      setTimeout(() => {
          observer.complete();
      }, 3000);
  });

  let subscription = this.data.subscribe(
      value => this.values.push(value),
      error => this.anyErrors = true,
      () => this.finished = true
  );
  }

}

问题2: observable何时开始执行?我想传递给observable的代码是异步执行的。在上面的代码中,是否有可能在observable订阅时,某些代码已经被执行(因此一些订阅者可能会错过数据)?

1 个答案:

答案 0 :(得分:4)

  

问题1:是否可以从数组中返回一个数字?

是的,因为TypeScript检查仅存在编译时,并且只有在正确指定类型时才能应用。你的代码应该是

protected long[] getpattern(int numbercount, int value) {
    return IntStream.range(0, numbercount).mapToLong(i -> value).toArray();
}

在这种情况下,TypeScript 生成编译错误,因为您尝试发出数字而不是发出数字数组。但请记住,在运行时,所有这些类型都不再存在,并且您只有this.data = new Observable<Array<number>>(observer => { ... ,它可以发出任何内容。

  

问题2:observable何时开始执行?

在这种情况下,当您订阅它时。