Observable使用场景的一个问题

发布于 2022-09-11 23:07:14 字数 1354 浏览 23 评论 0

环境:Angular2+

现在有一个组件内部

class Demo01 {
    data$: Observable<string[]>;
    constructor(private service: MyService) {
    
    }
    
    OnInit() {
        this.data$ = this.service.getData();
    }
    
    submit() {
        // 在这里我需要拿到this.data$中的数据去做一些处理
        // 如果直接对this.data$进行订阅的话,就会进入MyService中的getData()方法重新获取一次数据,但是我不想这样
        // **目前我的办法是,看下面的ts**
        
    }
    
    
}

Service:

class MyService {
    getData(): Observable<string[]> {
        return of(['1', '2', '3', '4']) // 这里有可能是个http请求
    }
}

模板:

<ul>
    <li *ngFor="let item of data$ | async">{{item}}</li>
</ul>
<button (click)="submit()">Submit</button>

我的解决办法是:

class Demo01 {
    data$: Observable<string[]>;
    data: string[]
    constructor(private service: MyService) {
    
    }
    
    OnInit() {
        this.data$ = this.service.getData().pipe(
            // 使用tap操作符监控this.data$, 将其中的数据缓存一份到this.data
            tap(data => {
                this.data = data;
            })
        );
    }
    
    submit() {
        // 在这里使用this.data
        
    }
    
    
}

不知道是否还有其他的操作能够解决这种场景呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海夕 2022-09-18 23:07:14

找到答案了,使用 sharedReplay 操作符

class Demo01 {
    data$: Observable<string[]>;
    data: string[]
    constructor(private service: MyService) {
    
    }
    
    OnInit() {
        // 使用这个操作符,会把'冷'的变成'热'的
        this.data$ = this.service.getData().pipe(
           sharedReplay() // 相当于缓存在 data$ 中了
        );
    }
    
    submit() {
        // 即使当前this.data$被绑定到模板中了, 在这里再次订阅this.data$, 也不会执行service中的getData()方法中 Observable内部的  of() 方法
        this.data$.subscribe((array) => {
           
        })
        
    }
    
    
}

参考

时光清浅 2022-09-18 23:07:14

我理解问题是,一个请求完成后,多处调用时不想再次请求。。
如果我理解正确的话,那存在service中,多处注入该service就好了。。何必这么麻烦。。service层本身存在就是为了数据通信的。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文