开始第一次调用 IntervalObservable 即时
Start first call of IntervalObservable instant
我正在使用 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);
}
}
那么我怎样才能在第一次调用时立即调用服务器,然后在定义的延迟后调用服务器?
您可以使用 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);
}
观看现场演示:http://plnkr.co/edit/4kdJRD7HZqrbce7MFPW7
import {Observable} from 'rxjs';
let httpRequest = () => Observable.of('response');
Observable.of(null)
.concat(Observable.interval(3000))
.concatMap(httpRequest)
.subscribe((response) => console.log(response));
第一个请求由 Observable.of(null)
触发,它通过运算符链并触发 httpRequest
。然后这一切都取决于 Observable.interval
运营商。
两件事,
- 您可以使用工厂方法而不是派生类型,即
Observable.interval(3000)
而不是 IntervalObservable.create
您可以使用 timer
来代替单个运算符:
return Observable.timer(0, 1000)
.flatMapTo(this.http.get(this.apiURL))
.map(this.extractData)
.catch(this.handleError);
对于#RxJS 版本 5+:
您可以使用 rxjs interval operator 并实施轮询。以下实现将每隔 1000 毫秒执行一次 this.statusService.getStatus()
行:
getList() {
return Observable.interval(1000).startWith(1)
.mergeMapTo(this.http.get(this.apiURL))
.catch(this.handleError);
}
添加startWith(1)
后,现在会立即执行,没有任何延迟,之后每1秒执行一次。
我想这就是你想要的。
或另一种方法: 您可以使用 timer operator 并执行以下操作:
getList() {
return Observable.timer(0, 1000)
.mergeMapTo(this.http.get(this.apiURL))
.catch(this.handleError);
}
在这种方法中,计时器运算符将立即执行,之后每 1000 毫秒执行一次。
另外别忘了导入:
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/mergeMapTo';
import 'rxjs/add/observable/timer';
我正在使用 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);
}
}
那么我怎样才能在第一次调用时立即调用服务器,然后在定义的延迟后调用服务器?
您可以使用 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);
}
观看现场演示:http://plnkr.co/edit/4kdJRD7HZqrbce7MFPW7
import {Observable} from 'rxjs';
let httpRequest = () => Observable.of('response');
Observable.of(null)
.concat(Observable.interval(3000))
.concatMap(httpRequest)
.subscribe((response) => console.log(response));
第一个请求由 Observable.of(null)
触发,它通过运算符链并触发 httpRequest
。然后这一切都取决于 Observable.interval
运营商。
两件事,
- 您可以使用工厂方法而不是派生类型,即
Observable.interval(3000)
而不是IntervalObservable.create
您可以使用
timer
来代替单个运算符:return Observable.timer(0, 1000) .flatMapTo(this.http.get(this.apiURL)) .map(this.extractData) .catch(this.handleError);
对于#RxJS 版本 5+:
您可以使用 rxjs interval operator 并实施轮询。以下实现将每隔 1000 毫秒执行一次 this.statusService.getStatus()
行:
getList() {
return Observable.interval(1000).startWith(1)
.mergeMapTo(this.http.get(this.apiURL))
.catch(this.handleError);
}
添加startWith(1)
后,现在会立即执行,没有任何延迟,之后每1秒执行一次。
我想这就是你想要的。
或另一种方法: 您可以使用 timer operator 并执行以下操作:
getList() {
return Observable.timer(0, 1000)
.mergeMapTo(this.http.get(this.apiURL))
.catch(this.handleError);
}
在这种方法中,计时器运算符将立即执行,之后每 1000 毫秒执行一次。
另外别忘了导入:
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/mergeMapTo';
import 'rxjs/add/observable/timer';