Javascript RxJS如何将一个流映射到另一个流的最新版本?

Javascript RxJS如何将一个流映射到另一个流的最新版本?,javascript,stream,rxjs,cyclejs,Javascript,Stream,Rxjs,Cyclejs,我目前正在使用Cycle.js,并试图在提交表单时获取文本输入流。例如: const textChange$ = DOMSource.select('input').events('change'); const textValueSubmit$ = DOMSource.select('form').events('submit') .do(ev => ev.preventDefault()); 我认为此时需要合并流,但我只关心最新的文本值(当用户提交表单时)。处理这种情况的适当

我目前正在使用Cycle.js,并试图在提交表单时获取文本输入流。例如:

const textChange$ = DOMSource.select('input').events('change');
const textValueSubmit$ = DOMSource.select('form').events('submit')
    .do(ev => ev.preventDefault());

我认为此时需要合并流,但我只关心最新的文本值(当用户提交表单时)。处理这种情况的适当方法是什么?

您也可以使用
sample()
来避免创建额外的函数,我相信这就是您正在寻找的功能

const textChange$ = DOMSource.select('input').events('change')
  .pluck('target', 'value')
const submit$ = DOMSource.select('form').event('submit')
  .do(ev => ev.preventDefault)
const textValueSubmit$ = textChange$.sample(submit$)

除了当前的答案之外,您还可以使用
和latestfrom
。请注意,
combinelatetest
withLatestFrom
语义在细微之处有所不同:

  • 每当一个组合源发射值时,CombineTest将发射值(,只要每个源可观测序列发射了至少一个元素)
  • withLatestFrom仅在组合源发出值时才会发出值
例如,你可以这样做:

const textChange$ = DOMSource.select('input').events('change')
  .pluck('target', 'value')
const submit$ = DOMSource.select('form').event('submit')
  .do(ev => ev.preventDefault)
const textValueSubmit$ = submit$.withLatestFrom(textChange$, function (submit, textChange){...});
即使这还不包括您的特定用例(这里您不关心提交事件传递的值,因此建议
sample
也可以正常工作),对于另一个类似的未来用例,最好记住这两个操作符


最后一件事,在这种情况下,
combinelateest
真的适合您吗?每次激发
textChange$
时,您似乎都会有一个
textValueSubmit$
发射。这就是我想要的行为吗?

好消息——CombineTest实际上不起作用,因为每次textChange$fires都会出现排放,这不是我的意图。好吧,我当时向你核实一下是对的。顺便说一句,当答案有用时,别忘了给它们投票。这些都是重要的指导方针。此外,如果您的答案不正确,那么最好将其删除,这样新加入线程的人就不会感到困惑。