首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角5同步HTTP调用

角5同步HTTP调用
EN

Stack Overflow用户
提问于 2018-03-23 07:54:28
回答 3查看 38.9K关注 0票数 16

我有一个角5应用程序,在这个应用程序中,我必须调用一些繁重的休息服务(通常需要几秒钟)。我需要它在应用程序的不同部分的结果,所以我想将结果存储在一个DataStorageService中。基本上,这是我想要达到的:

代码语言:javascript
复制
@Injectable()
export class DataStorageService {

private result: MyCustomObject;

constructor(private service: Service) {}

getResult(): MyCustomObject {
    if (typeof this.result === 'undefined') {
        // save result
    }
    return result;
}

问题是如何等待HTTP请求完成,然后保存并返回“result”对象。我试着用承诺和可观察的方法来解决这个问题,但他们都没有成功。

  1. 可观察的: 如果( this.result === 'undefined') { this.service.call() .subscribe(响应=> this.result = response);}返回this.result;//等待保存并返回MyCustomObject
  2. 承诺: 如果( this.result ===‘un定义’){ this.service.call() .toPromise() .then(响应=> this.result = response);}返回this.result;//等待保存并返回MyCustomObject
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-23 08:08:37

尝试使用await/async

代码语言:javascript
复制
async getResult(): Promise<MyCustomObject> {
    if (typeof this.result === 'undefined') 
    {
        // save result
        this.result = await this.service.call()
        .toPromise()
        .then(resp =>resp as MyCustomObject);//Do you own cast here

    }
    return this.result;
}
票数 21
EN

Stack Overflow用户

发布于 2020-06-08 06:52:06

我推翻了上面大卫的回答,但我认为可能有一个设计缺陷。实际上,您不应该(在本地存储中)将结果保存在getResult函数中。这是一种副作用,在某一时刻它可能是不可取的,并且使您的getResult很难重用,以防您只想不保存就可以获得。

同时,如果您想刷新数据,使用this.result === 'undefined'也可能会造成问题。

因此,如果您想在ngOnInit中获得这些结果,您可以这样做:

代码语言:javascript
复制
ngOnInit() {
    if (typeof this.result === 'undefined') {
        this.getResult().then(result => {
            // save the result here
            this.result = result;

            // save in local storage ...
        });
    }
}

getResult(): Promise<MyCustomObject> {
    return this.service.call().toPromise();
}

请注意,您不能在ngOnInit中等待。但是现在您的getResult()函数在许多其他情况下是可重用的。

票数 0
EN

Stack Overflow用户

发布于 2018-03-23 08:08:08

问题是如何等到HTTP请求完成,然后保存并返回're sult‘对象.

//服务守则:

代码语言:javascript
复制
ServiceMethod:Observabke<any>(){
     if (typeof this.result === 'undefined') {
                return this.service.call().map(res=>res);
}

//这是组件中的代码。

代码语言:javascript
复制
 componentMethod(){


        return this.service.ServiceMethod()
            .subscribe(response => {
                this.result = response;
               },
               ()=>//handle error,
               () => // call completed { return this.result;  // Subscriber});
    }
    return this.weeklyPlayer;  // MyCustomObject (This return won't wait for http to get completed. Not sure why you want multiple returns.)

    }

希望这能有所帮助。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49444816

复制
相关文章

相似问题

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