我在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订阅时,某些代码已经被执行(因此一些订阅者可能会错过数据)?
答案 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何时开始执行?
在这种情况下,当您订阅它时。