javascript - 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')
在这里我想取消订阅(当我点击第二个按钮时,但当我点击第一个按钮时有机会再次订阅)
我试过这样的东西
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);
推荐阅读
- paypal - 贝宝信用卡按钮隐藏贝宝标准按钮
- shell - shell脚本负载平均cpu
- webdriver - Appium:使用意图启动 android 应用程序?
- ios - 我没有在 WKWebview 中获得一个网页按钮的点击事件,以及如何使用 java 脚本将点击事件添加到 wkwebview
- data-structures - 带有内存的集合的数据结构的名称是什么?
- django - Django注销按钮引导导航栏
- java - 我有一个文件编写器方法,只有在我关闭它时才会输出到文件
- c# - 使用 Type 作为字典 C# 中的键
- laravel - 获取经过身份验证的用户的所有模型实例的最佳方法是什么?
- javascript - setState 打印更新后的控制台日志