Akk*_*ekt 5 rxjs typescript rxjs5 angular
我正在使用a IntervalObservable来连续调用我的应用程序的服务器端.我可以订阅和取消订阅Oberservable,一切正常,只有一个例外:
对服务器的第一次调用被延迟了,但我希望它是即时的.该行为IntervalObservable原则上是正确的,但不符合我的要求.
@Injectable()
export class LoggerService {
constructor(private http: Http) { }
private apiURL = 'assets/file.json';
getList() {
return IntervalObservable.create(1000).flatMap(()
=> this.http.get(this.apiURL))
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
var fooot = new Foo();
fooot.fillFromJSON(JSON.stringify(res.json()));
return fooot;
}
private handleError(error: any) {
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
return IntervalObservable.throw(errMsg);
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何在第一次通话时调用服务器,然后以定义的延迟调用服务器?
两件事情,
Observable.interval(3000)代替IntervalObservable.create您可以使用timer单个运算符来代替:
return Observable.timer(0, 1000)
.flatMapTo(this.http.get(this.apiURL))
.map(this.extractData)
.catch(this.handleError);
Run Code Online (Sandbox Code Playgroud)你可以使用startWith.
以下示例在创建流时在流上推送事件:
getList() {
return IntervalObservable.create(1000)
.startWith(1) // needs a value, but won't be used
.flatMap(() => this.http.get(this.apiURL))
.map(this.extractData)
.catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4925 次 |
| 最近记录: |