首页 > 解决方案 > Angular中的单例服务与异步HTTP调用?

问题描述

我正在使用 Angular (2+) 开发一个 Web 应用程序,我需要实现这样的服务:我有一个端点 (URL),我使用这个 URL 进行 POST HTTP 调用。响应包含一个令牌和指示此令牌有效时间的秒数。我的服务必须做这件事:检查令牌是否已过期(即如果截止日期已过)。如果是,它会进行 HTTP 调用并获取一个新的令牌,如果不是,它会将先前存储的令牌返回给客户端。

这是我的代码示例:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class MyPOSTService {

  private deadline;
  private token; // Stringa in cui viene salvato il tokenSTS  temporaneo

  constructor(private http: HttpClient) { }

  async getToken() {

    if(!this.deadline || Math.ceil(new Date().getTime()) > this.deadline) {
            
      await this.http.post(MY_URL, MY_BODY).toPromise().then((data: any) => {
      
        if(data) {
          this.token = data.token;
          this.deadline = data.deadline + Math.ceil(new Date().getTime()/60000) - 1;
        }
      })
    }

    return this.token;
  }

}

whereMY_URL是端点,MY_BODY是请求正文。data.token是令牌,data.deadline是指示此令牌有效时间的秒数。不幸的是,这个解决方案不起作用。如果客户端getToken()在一段时间后多次调用该方法,由于异步调用,this.deadline将始终未定义!如何以同步方式拨打电话?这样该getToken()方法就变成了“原子可调用”?

当然我的方法是错误的,但我希望我已经清楚了。我如何实现我想要实现的目标?我究竟做错了什么?

标签: javascriptangularhttpasync-awaitsingleton

解决方案


推荐阅读