首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何等待订阅完成角5?

如何等待订阅完成角5?
EN

Stack Overflow用户
提问于 2020-10-27 18:16:59
回答 1查看 943关注 0票数 0

我正在工作的角度5应用程序。我得到一个错误,因为我有一个函数在完成另一个函数之前执行,因此得到一个空变量。我试着用.map和.subscribe来观察,但没有成功。以下是代码:

loadData是从app.component类调用的。

代码语言:javascript
运行
复制
ngOnInit() {
    this.dataService.loadData(sessionStorage.getItem(...);
}

在执行该函数时,在初始化时调用来自data.component (dataService.getData)的另一个函数:

代码语言:javascript
运行
复制
constructor(private dataService: DataService) {}

ngOnInit() {
    this.dataTxt = this.dataService.getData(...);
}

下面是data.service类:

代码语言:javascript
运行
复制
loadData(... : void) {
    if (sessionStorage["data"] == null {
        this.http.request(...)
        .map((response: Response) => response.json()).subscribe(data => {
            ...
            sessionStorage.setItem("data", JSON.stringify(this.data));
            ...
        }
    }
}

getData(... : string){
    if (this.data == null) {
        this.data = JSON.parse(sessionStorage["data"]);
    }
    ...
}

问题是,在完成sessionStorage"data" ()之前,loadData是空的,并且我得到了几次这个错误:

代码语言:javascript
运行
复制
ERROR SyntaxError: Unexpected token u in JSON at position 0
    at JSON.parse (<anonymous>)

我知道,如果我想等待订阅完成,我必须将需要等待的代码(getData())放在订阅调用之后。但是需要等待的函数是从其他类调用的,所以我如何将它放在那里呢?

EN

Stack Overflow用户

回答已采纳

发布于 2020-10-27 18:24:49

你错了,你会把你的代码放在订阅处理程序后面,你需要把它放在订阅处理程序中,但无论如何,

您需要在这里使用某种主题,可能是特定情况下的ReplaySubject .

代码语言:javascript
运行
复制
private dataSource = new ReplaySubject(1) // create a private subject
data$ = this.dataSource.asObservable() // and a public observable

loadData(... : void) {
    if (sessionStorage["data"] == null {
        this.http.request(...)
        .map((response: Response) => response.json()).subscribe(data => {
            ...
            sessionStorage.setItem("data", JSON.stringify(this.data));
            this.dataSource.next(data) // set the data in the subject
            ...
        }
    }
}

然后你会订阅你的组件中的主题..。

代码语言:javascript
运行
复制
ngOnInit() {
    this.dataService.data$.pipe(first()) // avoid memory leak.
      .subscribe(data => this.dataTxt = data);
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64560587

复制
相关文章

相似问题

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