当事件发生在另一个可观察对象中时,从一个可观察对象中获取值
Retrieve values from one observable when an event happens in another observable
假设我有两个流。
- buttonPresses
每当一个值改变时,我在我的价值流中得到这个值。
每次我按下一个按钮,我在按钮流中得到一个事件。
我想做一些事情,当我得到一个事件在buttonpressed流,在值流中的最新值。进行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);
相关文章:
- 在ko.applyBindings(..)中执行Knockout js订阅函数(用于可观察对象)
- Knockout.js用单个json对象绑定一个可观察对象
- 根据某些条件将 JS 绑定到可观察对象内的数组元素
- 如何从挖空可观察对象中获取所选项目的文本
- 从另一个可观察对象获取价值的最佳方法,而无需组合最新
- 可观察对象的角 2 条件链接
- 观察对象是否已更改
- 如何在 angularjs 中观察对象中的对象
- 将通过原型计算的可观察对象添加到构造函数中
- 挖空解包可观察对象无法按预期工作
- 如何从可观察对象数组中删除项目
- 使用 Knockout 和 Typescript.如何从订阅中更改可观察对象的值
- Knockout+Moment.js–更新可观察对象内的相对日期
- 在AngularJS中观察对象
- 角度,观察对象中的特定关键点
- 微风导航阵列成员是淘汰赛中的可依赖观察对象
- 在knockout.js中为可观察对象添加属性后为什么出现TypeError
- Knockout js,访问循环外的可观察对象
- 敲除:绑定到同一可观察对象的几个 DOM 元素
- KnockoutJS-一个计算可写的可观察对象;无法正确更新绑定