[RxJS] Wrap up
Last thing to do is clean the score box and input, also auto foucs on input when click start.
const starters$ = Observable.merge( start$.mapTo(1000), half$.mapTo(500), quarter$.mapTo(250) ); // Clear the score box input and focus on input starters$.subscribe( () => { document.querySelector('#score').innerHTML = ""; input.value = ""; input.focus(); })
--------------------------
const Observable = Rx.Observable; const startButton = document.querySelector('#start'); const halfButton = document.querySelector('#half'); const quarterButton = document.querySelector('#quarter'); const stopButton = document.querySelector('#stop'); const resetButton = document.querySelector('#reset'); const input = document.querySelector('#input'); const start$ = Observable.fromEvent(startButton, 'click'); const half$ = Observable.fromEvent(halfButton, 'click'); const quarter$ = Observable.fromEvent(quarterButton, 'click'); const stop$ = Observable.fromEvent(stopButton, 'click'); const reset$ = Observable.fromEvent(resetButton, 'click'); const input$ = Observable.fromEvent(input, 'input') .map(event => event.target.value); const data = {count:0}; const inc = (acc)=> ({count: acc.count + 1}); const reset = (acc)=> data; const starters$ = Observable.merge( start$.mapTo(1000), half$.mapTo(500), quarter$.mapTo(250) ); // Clear the score box input and focus on input starters$.subscribe( () => { document.querySelector('#score').innerHTML = ""; input.value = ""; input.focus(); }) const intervalActions = (time)=> Observable.merge( Observable.interval(time) .takeUntil(stop$).mapTo(inc), reset$.mapTo(reset) ); const timer$ = starters$ .switchMap(intervalActions) .startWith(data) .scan((acc, curr)=> curr(acc)) const runningGame$ = timer$ .do((x)=> console.log(x)) .takeWhile((data)=> data.count <= 3) .withLatestFrom( input$.do((x)=> console.log(x)), (timer, input)=> ({count: timer.count, text: input}) ) .share(); // To clean the input runningGame$ .repeat() .subscribe( (x) => input.value = ""); runningGame$ .filter((data)=> data.count === parseInt(data.text)) .reduce((acc, curr)=> acc + 1, 0) .repeat() .subscribe( (x)=> document.querySelector('#score').innerHTML = ` ${x} `, err=> console.log(err), ()=> console.log('complete') );
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.1/dist/global/Rx.umd.js"></script> <title>JS Bin</title> </head> <body> <button id="start">Start</button> <button id="half">Half</button> <button id="quarter">Quarter</button> <button id="stop">Stop</button> <button id="reset">Reset</button> <hr> <input type="text" id="input"> <div>Score: <span id="score"></span></div> </body> </html>
分类:
RxJS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2015-03-14 [Node.js] Using npm link to use node modules that are "in progress"
2015-03-14 [Server Running] [Node.js, PM2] Using PM2 To Keep Your Node Apps Alive