javascript - 当事件发生在另一个可观察量中时,从一个可观察量中检索值

标签 javascript rxjs

假设我有两个流。

  • 值(value)观
  • 按下按钮

每次值发生变化时,我都会在值(value)流中获取该值。

每次按下按钮时,我都会在按钮流中收到一个事件。

当我在 ButtonPresses 流中收到事件时,我想执行一些操作,并使用值流中的最新值。例如进行 API 调用。

但是,我不希望每次值发生变化时都会发生一些事情。

我认为这是一个“以可观察的方式思考”的问题。这是我正在努力解决的实际代码。

/**
 * Provides a stream of POSTCODE_LOOKUP action events
 * @type {Object}
 */
export let PostcodeLookupActionsStream = Actions.stream
    .filter( action => action.key === KEYS.POSTCODE_LOOKUP );

/**
 * Provides a stream of values from a post code input field.
 * @type {Object}
 */
export let PostCodeValueStream = Actions.stream
    .filter( action => action.key === KEYS.POSTCODE_CHANGE )
    .map( action => action.payload.postcode )
    .shareReplay(1);

// Combine the two streams....?
export let PostCodeLookupStream = Rx.Observable
    .merge(PostCodeValueStream, PostcodeLookupActionsStream)
    .map( (value, action) => value);

/**
 * Provides a stream of address retrieved from a postcode lookup
 * @type {Array}
 */
export let AddressStream = PostCodeLookupStream
    .flatMapLatest( postcode =>  MyAPI.postcodeLookup( postcode ) )
    .flatMap( response => response.json() )
    .shareReplay(1);

最佳答案

答案是使用withLatestFrom。我不知道为什么我花了这么长时间才在文档中找到它,但确实如此。

/**
 * Provides a stream of POSTCODE_LOOKUP events
 * e.g: A stream of postcodes.
 * @type {Object} a mouse event
 */
export let PostcodeLookupIntentsStream = Actions.stream
    .filter( action => action.key === KEYS.POSTCODE_LOOKUP );

/**
 * Provides a stream of values from a  post code input field
 * @type {String}
 */
export let PostCodeValueStream = Actions.stream
    .filter( action => action.key === KEYS.POSTCODE_CHANGE )
    .map( action => action.payload.postcode )
    .shareReplay(1);


/**
 * Combines `PostcodeLookupIntentsStream` and `PostCodeValueStream` to
 * produce a stream of postcode values. New postcode values are emitted
 * every time an event is emitted from the            
 * `PostcodeLookupIntentsStream`
 */
export let PostCodeLookupValueStream = PostcodeLookupIntentsStream
    .withLatestFrom( PostCodeValueStream, (action, value) => value  );


/**
 * Provides a stream of address retrieved from a postcode lookup
 * @type {Array}
 */
export let AddressStream = PostCodeLookupStream
    .flatMapLatest( postcode => return MyAPI.postcodeLookup( postcode ) )
    .flatMap( response => response.json() )
    .shareReplay(1);

关于javascript - 当事件发生在另一个可观察量中时,从一个可观察量中检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149710/

相关文章:

javascript - 为什么元标记注入(inject)不适用于桌面浏览器?

javascript - 如何一键切换两个图像(html/js)

angular - 如何延迟重置 Observable?

javascript - 如何处理 redux-observable 中的异步函数?

javascript - 观察浏览器窗口

javascript - React JS - 替换匹配字符串并将字符串添加到下一个匹配字符串

javascript - 双引号之间的数字

javascript - 省略 mongodb 中不必要的属性

angular - map 后显示可观察

javascript - 使用 Observable 排队 promise