javascript - 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()
方法就变成了“原子可调用”?
当然我的方法是错误的,但我希望我已经清楚了。我如何实现我想要实现的目标?我究竟做错了什么?
解决方案
推荐阅读
- backpropagation - 注意力模型中的反向传播
- python - 在 Windows 10 上通过 TGZ 安装 Python 3.4.x
- javascript - 匹配精确句子和单个单词的正则表达式?
- javascript - 从路由获取的动态 Div Id
- c# - 由于元素创建的顺序,无法找到实线和线的交点
- drupal - 在 Drupal 中,内容和节点是否指代新页面?
- kubernetes - 谁/在哪里实际工作在 kubernetes 中进行活性探测?
- html - 为什么有些 URL 在 Web 浏览器中查看图像而有些只是触发文件下载?
- java - 如何在 Android Studio 中创建简单的两页 Android 滑动应用程序
- mysql - 使用 Mapping 连接两个表并获取结果