RxJS如何将流映射到不同流中的最新流



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

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

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

添加到当前答案中,您还可以使用withLatestFrom。注意,combineLatestwithLatestFrom语义在细微之处有所不同:

  • 只要组合的源中有一个发出值,combineLatest就会发出值(只要每个源可观测序列至少发出一个元素
  • 只有当组合源发出值时,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也可以正常工作),对于另一个类似的未来用例,记住这两个操作符仍然是很好的。

最后,combineLatest在这种情况下真的适用于您吗?似乎每次textChange$发射时都会有textValueSubmit$发射。这是预定的行为吗?

您也可以使用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$)

相关内容

  • 没有找到相关文章

最新更新