首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular4 switchMap

Angular4 switchMap
EN

Stack Overflow用户
提问于 2018-07-19 13:37:51
回答 2查看 73关注 0票数 0

在我的Angular 4应用程序中,是一个维护预订对象列表的服务,如下所示。此预订列表是一个主题。

代码语言:javascript
复制
    //imports

    @Injectable()
    export class BookingTreeService {
      selBooking: Booking;
      bookingList: Array<Booking> = [];
      bkgList$: Observable<Array<Booking>>;
      private bkgListSubject: Subject<any>;

      constructor( private resHttp: ResHttpService) {

        this.bkgListSubject = new Subject<Array<Booking>[]>();
        this.bkgList$ = this.bkgListSubject.asObservable();
      }

      loadBooking(bookingId:number): Observable<any> {
        let item = this.bookingList.filter(b => b.bookingId === bookingId);
        if (item && item.length > 0) {
         return this.retrieveBooking(bookingId); 
         // here, I don't want to call http call. Need to update the booking tree
        }
        else {
          return this.loadBookingAndLock(bookingId);
        }
      }

      loadBookingAndLock(bookingId: any): Observable<any> {
        return this.resHttp.loadBookingAndLock(bookingId)
          .map(response => {
            //handle response
          })
          .catch(this.handleError);
      }

      retrieveBooking(bookingId: any): Observable<any> {
        return this.resHttp.retrieveBooking(bookingId)
          .map(response => {
            //handle response
          })
          .catch(this.handleError);
      }

      addBooking(booking: Booking) {
        this.bookingList.push(booking);
        this.updateBookingTree(booking);
      }

      updateBookingTree(booking: Booking):void {
        this.bookingList.map((b:Booking) => {
          b.active = b.bookingId === booking.bookingId;
        });
        this.bkgListSubject.next(this.bookingList);
      }
    }

在组件中,我调用ngOnInit内部的loadBooking,如下所示。

代码语言:javascript
复制
loadBooking() {
    this.paramsSubscription = this.route.params
      .switchMap((params: Params) => this.bkgTreeService.loadBooking(+params['id']))
      .subscribe(
        response => {
        },
        (error) => {
          console.log(error);

        }
      );
  }

如果选择的预订已经包含在预订树中,则不想再次调用http请求,只想更新预订树。但是在switchMap内部,它只接受Observable。那么怎么处理呢?

如有任何建议,欢迎光临。

EN

回答 2

Stack Overflow用户

发布于 2018-07-19 14:02:52

这里我所理解的是您想要缓存数据,因此您可以使用shareReplay的Rxjs缓存。

更多详细信息请访问:- https://blog.thoughtram.io/angular/2018/03/05/advanced-caching-with-rxjs.html

票数 0
EN

Stack Overflow用户

发布于 2018-07-19 14:20:20

您必须在拨打电话时使用"tap“来存储预订列表

代码语言:javascript
复制
loadBookingAndLock(bookingId: any): Observable<any> {
    return this.resHttp.loadBookingAndLock(bookingId)
       //When the observable finished
       .pipe(tap(response=>{
              //we concat the response to the bookingList
              if (!this.bookingList.find(b=>b.bookingId==bookingId)
                    this.bookingList.concat(response);
            }))
       .catch(this.handleError);
      }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51415050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档