javascript - 单击按钮后取消订阅的 RXJS 方式,但有机会再次订阅

标签 javascript html rxjs

import { reduce, filter, map, mapTo } from 'rxjs/operators'
import { from, fromEvent, scan, Subscription } from 'rxjs'

const button1 = document.getElementById("but1")
const button2 = document.getElementById("but2")
const button3 = document.getElementById("but3")



let click1 = fromEvent(button1, 'click')
.subscribe(result => {
    count3.subscribe(x => p3.innerHTML = `Click count: ${x}`)
})


let click2 = fromEvent(button2, 'click')

here i want to unsubscribe subscription (when i click on second button, but with opportunity to subscribe again when i click first button)

我尝试过类似的事情

const sub = click1.subscribe(result => {
        count3.subscribe(x => p3.innerHTML = `Click count: ${x}`)
    })


let click2 = fromEvent(button2, 'click')
    sub.unsubscribe()

但我不知道如何将 sub.unsubscribe() 放入按钮

let click3 = fromEvent(button3, 'click')

let three = click3.pipe(mapTo(1))

let c: number = 0

let count3 = three.pipe(scan((acc, val) => acc + val, c))

const d = document.getElementById("d")
const p3 = document.createElement("p")


//count3.subscribe(x => p3.innerHTML = `Click count: ${x}`)

d?.appendChild(p3)

最佳答案

我们可以在单击第二个按钮时取消订阅,然后当再次单击第一个按钮时,我们需要清除已经存在的所有订阅,然后重新初始化订阅,最后再次订阅。

如果您发现此困惑,请告诉我,我会澄清您的疑虑。

我不确定您想要实现什么目标,但请使用下面的示例并将其修改为您的用例。

import { mapTo } from 'rxjs/operators';
import { fromEvent, scan, Subscription } from 'rxjs';

const button1 = document.getElementById('but1');
const button2 = document.getElementById('but2');
const button3 = document.getElementById('but3');
let clickCountSubscription = new Subscription();
let interimValue = 0;
const getCount3 = () => {
  let click3 = fromEvent(button3, 'click');
  let three = click3.pipe(mapTo(1));
  return three.pipe(
    scan((acc, val) => {
      interimValue = acc + val;
      return acc + val;
    }, interimValue)
  );
};
let click1 = fromEvent(button1, 'click').subscribe((result) => {
  clickCountSubscription.unsubscribe();
  clickCountSubscription = new Subscription();
  clickCountSubscription.add(
    getCount3().subscribe((x) => (p3.innerHTML = `Click count: ${x}`))
  );
});

let click2 = fromEvent(button2, 'click').subscribe(() => {
  clickCountSubscription.unsubscribe();
});
const d = document.getElementById('d');
const p3 = document.createElement('p');

d?.appendChild(p3);

stackblitz

关于javascript - 单击按钮后取消订阅的 RXJS 方式,但有机会再次订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69945765/

相关文章:

javascript - rxjs5 - WebSocketSubject 不是构造函数

javascript - 远程 Shell 应用程序 Node.js

javascript - 为属于某个类的特定按钮应用 CSS 规则

javascript - 将变量添加到页面中 - wordpress

javascript - 是否可以在悬停 div 时从 .m3u 源流式传输?

html - 边框的右下角不见了?

angular - RxJS Observables - 多个订阅者获取对同一对象的引用

javascript - 在 RXJS 中创建自定义可管道操作符

javascript - 如何使用 jQuery 动态添加 html,并在元素上添加点击监听器?

javascript - Highcharts:动态添加系列值到类别名称