情况如下: 我有一个websocket用于应用程序和服务器之间的通信.如果websocket坏了,我想启用备份长轮询,直到websocket再次激活.

我想到创建一个根据WS的连接/断开来改变状态的信号布尔值.如果WS是活动的,我将信号设置为true,否则设置为false.

 WSStatus = signal(false);
 WS is up: this.WSStatus(true)
 WS go down: this.WSStatus(false)

我曾想过做类似的事情,但是takeUntil等待Observable,我无法用Observable替换Signal操作

 this.startPolling(5000).pipe(takeUntil(!this.WSStatus())).subscribe()
 startPolling(interval: number = 5000): Observable<string> {
  
    return timer(0, interval)
      .pipe(
        switchMap( () => { return this.myHttpRequest() })
      );
  }

推荐答案

代码的目的是有一个备份到websocket的情况下的问题,所以当它不活动时,我运行一个长时间的HTTP协议轮询,直到websocket再次成为活动.

This is the solution I found:

属性:

pollingDone = signal(false)
private timerDone$ = new Subject<boolean>();

ws连接:

...
openObserver: {
  next: (event) => {
    this.pollingDone.set(true);
  }
},
closeObserver: {
  next: (event) => {
    this.pollingDone.set(false);
  }
}
...

构造函数

effect( () => {
  this.timerDone$.next(this.pollingDone())
  if(this.pollingDone() === false) {
    this.startPolling(5000).subscribe(val => this.store.dispatch(TablePageActions.load()))
  }
})

方法

startPolling(interval: number = 5000): Observable<any> {
  return timer(0, interval)
  .pipe(
    takeUntil(this.timerDone$)
  )
}

也许它不是风格,我很难定义一个可观察的布尔值接受takeUntil,无论如何,似乎目标已经实现.我试图直接连接到openObserver和closeObserver事件,但失败了.

Javascript相关问答推荐

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

如何避免移动设备中出现虚假调整大小事件?

在页面上滚动 timeshift 动垂直滚动条

扫描qr code后出错whatter—web.js

Promise Chain中的第二个useState不更新

如何将多维数组插入到另一个多维数组中?

在运行时使用Next JS App Router在服务器组件中运行自定义函数

Reaction组件在本应被设置隐藏时仍显示

OpenAI转录API错误请求

Vaadin定制组件-保持对javascrip变量的访问

如何访问此数组中的值?

为列表中的项目设置动画

如何修复使用axios运行TSC index.ts时出现的错误?

Socket.IO在刷新页面时执行函数两次

为什么我不能使用其同级元素调用和更新子元素?

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文

如何在移动设备中使用JAVASSCRIPT移除点击时的焦点/悬停状态

JavaScript:多个图像错误处理程序

是否有静态版本的`instanceof`?

如何向内部有文本输入字段的HTML表添加行?