【问题标题】:Angular2 call to web service via a promise is resolved before web service called is complete在调用的 Web 服务完成之前,通过 Promise 解决 Angular2 对 Web 服务的调用
【发布时间】:2017-08-28 21:59:21
【问题描述】:

我有一个 angular 2 服务,它有一个返回下拉列表数据的函数。该函数返回一个承诺。

来自以下服务的代码:

getStuff(): Promise<Stuff>
    {
            return this.http.get("http://myserver/myServices/myService.svc/rest/getStuff")
            .map(res => this.dataHandler.extractData(res)).toPromise()
            .catch(err => this.dataHandler.handleHttpError(err));
    }

然后我从保存事件调用此函数以更新新保存的数据,以便使用此数据的下拉列表将具有最新数据。

我调用此服务的代码:

    ngOnInit()
    {
      this.onSavedSubscription = this.OnSaved.subscribe((data: any) =>
      {
        if (data.IsSuccessful)
        {
            this.myService.getStuff().then(
                res=>
                {
                    this.myService.stuffs = res;
                }
            );
      }
    }

调用上述代码时,会调用 getStuff 函数,但在它可以从数据库返回更新数据之前,代码执行转移到“then”,并用 res.myService.stuffs 中包含的旧数据填充 this.myService.stuffs。我不确定发生了什么。我认为“then”在 getStuff 完成执行并返回新数据之前不会执行。请帮忙。

【问题讨论】:

  • 你想得对,getStuff().then() 在得到解决之前不应该执行 getStuff().then() 。工商管理硕士您还有其他与这部分冲突的代码,很难说。
  • 感谢您对 metamaker 的评论。是的,我认为 getStuff().then() 只会在 getStuff 完成后执行,并且从 getStuff 返回的数据将在 getStuff().then() 的 res 参数中。这是它第一次的行为方式,但是在随后的页面访问中,getStuff().then() 在 getStuff() 完成之前执行,并且 res 包含旧数据。

标签: angular typescript promise angular-promise


【解决方案1】:

我发现该行为的原因是数据正在被缓存,因此我将服务更改为以下内容:

getStuff(useCachedData: boolean = true): Promise<Stuff>
{
    if (useCachedData)
    {
        return this.http.get("http://myserver/myServices/myService.svc/rest/getStuff")
            .map(res => this.dataHandler.extractData(res)).toPromise()
            .catch(err => this.dataHandler.handleHttpError(err));
    }
    else
    {
        let headers = new Headers();
        headers.append('Cache-control', 'no-cache');
        headers.append('Cache-control', 'no-store');
        headers.append('Expires', '0');
        headers.append('Pragma', 'no-cache');


        return this.http.get("http://myserver/myServices/myService.svc/rest/getStuff", { headers: headers })
            .map(res => this.dataHandler.extractData(res)).toPromise()
            .catch(err => this.dataHandler.handleHttpError(err));
    }
}

这样我可以选择是否缓存。如果我遗漏了什么,或者有更好/更简单的方法来选择何时缓存,请发表评论并告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2018-03-08
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多