我知道一点BaconJS,但现在我正在尝试通过创建“用户输入...”指示器来学习RxJS。这很简单,可以用两个简单的规则来解释:
我不确定这是否正确,但我到目前为止已创建了两个流:
0
的心跳流。1
的一个流。然后我将它们合并在一起,然后简单地点击结果。如果它是1
,那么我会显示指标。如果它是0
,那么我隐藏指标。
这就是这样:
const showTyping = () =>
$('.typing').text('User is typing...');
const showIdle = () =>
$('.typing').text('');
// 1 second heartbeats are mapped to 0
const heartbeat$ = Rx.Observable
.interval(1000)
.mapTo(0);
// user typing events are mapped to 1
const input$ = Rx.Observable
.fromEvent($('#input'), 'input')
.mapTo(1);
// we merge the streams together
const state$ = heartbeat$
.merge(input$)
.do(val => val === 0 ? showIdle() : showTyping())
.subscribe(console.log);
以下是JSBin的链接:
http://jsbin.com/vekixuv/edit?js,console,output
我对此实施有几个问题和疑问:
0
会偷偷摸摸,因此指示灯会在返回下一次用户击键之前闪烁一瞬间。我觉得我完全偏离了我的实施,我感谢您提供的任何帮助。感谢。
答案 0 :(得分:7)
您甚至不需要使用两个Observable,只使用一个debounceTime()
。您尝试制作的所有逻辑都已存在于debounceTime()
运算符中:
const showTyping = () =>
$('.typing').text('User is typing...');
const showIdle = () =>
$('.typing').text('');
const input$ = Rx.Observable
.fromEvent($('#input'), 'input')
.do(() => showTyping())
.debounceTime(1000)
.subscribe(() => showIdle());
答案 1 :(得分:3)
你不需要心跳,只要在事情发生/发生变化时发出变更事件:
const showTyping = () =>
$('.typing').text('User is typing...');
const showIdle = () =>
$('.typing').text('');
// user typing events
const input$ = Rx.Observable
.fromEvent($('#input'), 'input');
// user stopped typing
const stoppedTypingAfter1s$ = input$
.switchMapTo(Rx.Observable.timer(1000));
// we merge the streams together
const state$ = Rx.Observable.merge(
input$.mapTo(1),
stoppedTypingAfter1s$.mapTo(0)
)
.startWith(0)
.do(val => val === 0 ? showIdle() : showTyping())
.subscribe(console.log);
查看实时here。
switchMap
,每当发出新的输入事件时,都会丢弃任何prevouse 1s-timer。