当前位置: 首页 > 知识库问答 >
问题:

使用RxJS和angular 2 HTTP服务重新连接服务器

陆昊
2023-03-14

使用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
this.serviceOnline.next(false);

...ServiceOnline仅在http服务返回成功响应且当前联机状态为false(断开连接)时发出另一个值:

if(this.serviceOnline.getValue() == false)
   this.serviceOnline.next(true);

所以TakeTaile应该有效。我在这里误解/遗漏了什么?

我是RxJS的新手--任何关于改进这段代码中实现的其他指针也将非常感谢...

共有1个答案

马航
2023-03-14

我认为出现问题是因为This.ServiceOnline总是在订阅时发出最后一个值,因为它是BehaviorSubject的实例。当您将它作为可观察的通知符传递给TakeTakeTake运算符时,TakeTakeTake将订阅它,并立即接收一个通知,该通知将立即完成结果的可观察性。请注意,无论通知符observable是发出true还是发出falsetake,直到completes。

尝试.TakeIte(this.serviceOnline.filter(online=>online===true))

 类似资料:
  • 我遇到了一种奇怪的情况,第一次需要连接到SFTP服务器,但似乎找不到访问该服务器已知主机条目的方法。如果我说: 但显然这让你容易受到中间人的攻击。因此,我尝试连接: 我会收到各种各样的错误信息。最近的一次是: 我运气不好吗?我是不是应该绕过钥匙检查?

  • 线程“main”io.netty.channel.abstractchannel$AnnotatedConnectException:连接被拒绝:无进一步信息:/127.0.0.1:8888在sun.nio.channel.checkConnect(本机方法)在sun.nio.channel.socketchannel.finishConnect(未知源)在io.netty.channel.soc

  • 启动mysql服务: sudo service mysql start 停止mysql服务: sudo service mysql stop 要连接到服务器,我们通常需要提供MySQL的用户名来触发mysql,很可能,还需要密码。如果你的服务器运行在一个其他的机器上,你还需要指定主机名。联系管理员来找到连接参数(例如主机名,用户名和密码),当你知道了正确的参数后,你可以像下面那样连接: she

  • 可选项显示详细信息的摘要。当编辑详细项时,我想用更新的信息更新可选项。 我有一个api服务,它使用HttpClient从后端获取值。 api.service.ts items-data.service.ts 主组件(左侧)只注册可观察的数据服务。 item-master.component.ts

  • 问题内容: 我有一个RMI服务器和一个桌面RMI客户端。重新启动服务器时,客户端出现错误。是否可以在不重新启动客户端的情况下重新启动RMI连接? [编辑]这是堆栈跟踪: 问题答案: 服务器终止后,您将收到一个ConnectException。之后,您可以使用Naming.lookup获取新的服务器对象。

  • 问题内容: 在Node.js中,我将websockets / ws 用于WebSocket连接。下面是客户端的代码。假设我们要连接的服务器套接字关闭了一分钟。关闭事件将触发,但是每当服务器上的套接字出现故障或错误时,重新连接到套接字的最佳方法是什么? 问题答案: 我已经成功使用https://github.com/joewalnes/reconnecting- websocket/blob/mas