使用RxJS和Angular 2处理服务器重新连接的最佳方法是什么?
这是我到目前为止所做的:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import 'rxjs/add/operator/takeUntil';
import 'rxjs/add/observable/throw';
@Injectable()
export class ConnectionService {
// Stores the current status of the connection, false = not connected
serviceOnline: BehaviorSubject<boolean> = new BehaviorSubject(false)
constructor(
private http: Http
) {
this.serviceOnline.asObservable().subscribe((online) => {
console.log("Service online: " + JSON.stringify(online))
})
setTimeout( () => this.setServiceOffline(), 2000 );
}
setServiceOffline() {
console.log("Setting service offline");
this.serviceOnline.next(false);
this.testConnection().delay(2000).repeat().takeUntil(this.serviceOnline).subscribe();
}
testConnection(): Observable<boolean> {
console.log("Testing connection");
return new Observable(observer => {
this.http.get(`http://endpoint/ping`)
.timeout(5000)
.catch((error: any) => Observable.throw(error))
.subscribe(() => {
console.log("Connection successful");
if(this.serviceOnline.getValue() == false)
this.serviceOnline.next(true);
observer.next(true);
observer.complete();
}, (error) => {
console.log("Connection failed");
if(this.serviceOnline.getValue() == true)
this.serviceOnline.next(false);
observer.next(false);
observer.complete();
});
})
}
}
控制台中的结果:
Service online: false
Setting service offline
Service online: false
Testing connection
Connection failed
如果我更换此行..
this.testConnection().delay(2000).repeat().takeUntil(this.serviceOnline).subscribe();
与
this.testConnection().delay(2000).repeat().take(5).subscribe();
我确实得到了重复:
Service online: false
Setting service offline
Service online: false
Testing connection
Connection failed
Connection failed
Connection failed
Connection failed
Connection failed
public takeUntil(notifier:Observable):Observable
发出源Observable发出的值,直到通知程序为止 Observable会发出一个值。
仅当服务器状态发生更改时,才会更新serviceOnline BehaviorSubject。在此之后......
this.serviceOnline.next(false);
...当http服务返回成功的响应并且当前在线状态为false(已断开连接)时,serviceOnline仅发出另一个值:
if(this.serviceOnline.getValue() == false)
this.serviceOnline.next(true);
所以takeUntil应该工作。我在这里误解/遗失了什么?
我是RxJS的新手 - 关于改进此代码中的实现的任何其他指针也将非常感谢......
这是一个Plnkr:http://plnkr.co/edit/WUKxH6nFxc8LMKcxDPql?p=info
RxJS版本5.4。 Angular版本4。
将serviceOnline作为observable返回并不能解决问题: 。this.testConnection()延迟(2000).repeat()takeUntil(this.serviceOnline.asObservable())订阅();
答案 0 :(得分:0)
嗯,你有没有试过这样做?:
this.testConnection().delay(2000).repeat().takeUntil(this.serviceOnline.asObservable()).subscribe();
答案 1 :(得分:0)
我认为问题出现是因为this.serviceOnline
总是在订阅时发出最后一个值,因为它是BehaviorSubject
的一个实例。当您将takeUntil
运算符作为通知符observable传递给takeUntil
运算符时,true
会对其进行订阅并立即收到通知,从而立即完成生成的observable。请注意,无论观察者是否发出false
或takeUntil
,.takeUntil(this.serviceOnline.filter(online => online === true))
在收到任何值时都会完成,这无关紧要。
请尝试int main()
{
int a = 0;
int x = 3, y = 2, z = 1;
auto f = [&a,=]() { a = x + y + z; };
f();
}
。