Search code examples
javascriptangulartypescriptrxjsobservable

RxJS, Observable, how to preserve value and switch map to another one


// 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();
  });

Any segestion about how to prevser value and switch map together, without one line variable like above?


Solution

  • I think this is the operator

    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();      
      });
    

    Note, take(1) will close subscription, but if you want the user to be able to press the button many times, save the subscription to a const and unsubscribe when finished.