// ticker$ will update every 3s
// showHand$ will only triger after user click button
// I would like to take last ticker price as user order price when user click button
let lastPrice: number;
this.ticker$
// What I am doing now is preserve value to vairable here.
.do(ticker => lastPrice = ticker.closePrice)
.switchMap(() => this.showHand$)
.subscribe(showHand => {
// use value here
this.order.price = lastPrice;
this.order.amount = showHand.amount;
this.order.type = showHand.type;
this.submit();
});
关于如何使用普遍值并将地图切换到一起,如果没有像上面那样的一个行变量的任何关于?
答案 0 :(得分:6)
您需要的行为是SwitchMap
的重载,每个(outerValue,innerValue)
的组合都有一个selectorFunc:
this.ticker$
.switchMap(
() => this.showHand$,
(tickerValue, switchMap) => tickerValue
)
.subscribe(showHand => { });
答案 1 :(得分:1)
我认为这是运营商
this.showHand$.take(1)
.withLatestFrom(this.ticker$)
.subscribe(([showHand, ticker]) => {
this.order.price = ticker.closePrice;
this.order.amount = showHand.amount;
this.order.type = showHand.type;
this.submit();
});
注意,take(1)将关闭订阅,但如果您希望用户能够多次按下该按钮,请将订阅保存为const并在完成后取消订阅。
答案 2 :(得分:1)
版本6中弃用的结果选择器功能将在版本7中删除。
来自文档:
带有resultSelector(v5.x)
source.pipe(
switchMap(fn1, fn2)
)
没有结果选择器的相同功能,可通过内部地图实现
source.pipe(
switchMap((a, i) => fn1(a, i).pipe(
map((b, ii) => fn2(a, b, i, ii))
)
)
答案 3 :(得分:0)
有一个小技巧可以实现这一点 - 基本上你在 switchmap 中有一个全新的 observable,并且这个 observable 可以访问传递给 switchmap 函数的值。您可以在内部映射中使用此值来保留该值。
this.ticker$
.switchMap(ticker => this.showHand$.pipe(map( (hand) => { ticker,hand } )))
.subscribe( obj => {
// use value here
this.order.price = obj.ticker;
this.order.amount = obj.hand.amount;
this.order.type = obj.hand.type;
this.submit();
});