Angular 打字稿';等待&x27;不';你似乎等不及了?
请原谅noobie的错误,我是从C#背景来的,所以这可能是问题的一部分。 我试图从Ionic storage中获取一个存储的令牌,但我很难理解承诺和。然后决定使用“等待”,因为我习惯了c#中的“等待” 这是我想要构造的Api服务的一部分,因此需要按顺序获取http头,因此在构造函数中,我检索令牌以将其添加进去。 以下是Api服务TS文件的一部分:Angular 打字稿';等待&x27;不';你似乎等不及了?,angular,typescript,ionic-framework,Angular,Typescript,Ionic Framework,请原谅noobie的错误,我是从C#背景来的,所以这可能是问题的一部分。 我试图从Ionic storage中获取一个存储的令牌,但我很难理解承诺和。然后决定使用“等待”,因为我习惯了c#中的“等待” 这是我想要构造的Api服务的一部分,因此需要按顺序获取http头,因此在构造函数中,我检索令牌以将其添加进去。 以下是Api服务TS文件的一部分: export class ApiService { ServerUrl = environment.url; Beare
export class ApiService {
ServerUrl = environment.url;
BearerToken: string;
GetUserDetailsEndPoint = 'api/Account/GetUserDetails';
UpdateUserDetailEndPoint = 'api/Account/UpdateUserDetail';
TokenEndPoint = 'Token';
RegisterEndPoint = 'api/Account/Register';
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'bearer ' + this.BearerToken
})
};
constructor( private http: HttpClient,
private storage: Storage,
private alertController: AlertController ) {
this.getBearerToken(); // I put this in a function cos not sure how the async stuff plays out in a constructor
console.log('Have awaited the token and its value is:' + this.BearerToken);
}
async getBearerToken() {
this.BearerToken = await this.storage.get(TOKEN_KEY);
}
很简单,“this.BearerToken”在发送到控制台时是未定义的。(存储中不存在该值)。
这显然是某种异步类型的问题,但我很难理解为什么“等待”不能。。?
我已经读了很多书,但大多数时候人们都在使用带有承诺的.then功能。我错过了什么?
谢谢
编辑
在这里接受了Igor的建议之后,我将初始化从UserService移到菜单页面的ngOnInit中,这是我首先需要使用它的地方。我在从本地存储而不是令牌获取用户信息的同一领域,但这是同一个问题。
所以我想我还是不明白。。。获取存储用户的函数如下所示:
async getUserStore() { // Populate the data object with the stored info
this.data = await this.storage.get(USER_DATA);
console.log('getUserStore: email = ' + this.data.Email);
}
其中this.data是服务类中的UserData对象。
但是,此函数仍然返回一个承诺,而不是在返回之前等待。我是否需要让它返回一些特定的东西,以便等待真正等待?e、 g
return await this.storage.get(USER_DATA);
或者使用.then方法,如果是这样,“等待”的意义何在
我的调用函数如下所示:(按预期工作)
}
而对于异步函数中的await,我希望它是这样的:(这不起作用)
}
那么如何(使用wait)让它在被调用的函数中真正等待呢?或者我不能?
Cheers不要在
构造函数中调用async/await
,因为构造函数不支持async/await
关键字。如果您想使用async/await
您应该确保所有Promise
都使用then()
等方法等待或解决,如果您确实使用async/await
则带有await
调用的方法的签名前缀为async
将“复杂”逻辑放入构造函数的设计缺陷之一是,您的类型很难进行单元测试。在本例中,另一个是不能使用关键字wait
,因为不能将构造函数标记为async
选项1-提供标记为async/await的新方法
选项2-使用标准的promise方法,如
编辑
我猜您希望将其用于组件或指令。您只需要在组件或指令中使用方法ngOnInit
实现OnInit
。这就是创建组件时,您应该放置要运行的代码的位置
export class MyComponent implements OnInit {
myBearerToken: any;
constructor(private service: AuthService) { }
async ngOnInit() {
this.myBearerToken = await this.service.getBearerToken();
}
}
或者,您也可以使用然后
进行相同的调用,即使您正在调用的是异步/等待
编辑2
在您希望如何更改为wait的最后一个示例中,您从未使用wait或async。应该是:
async ngOnInit() {
await this.user.getUserStore();
// rest of code
您没有唤醒调用this.getBealerToken()构造函数中的代码>。出于其他原因,您不应该在构造函数中执行异步操作,但这就是为什么它还没有完成。谢谢Igor和JBC,好吧,所以您要说的是不要在构造函数中调用异步函数,但是如果我需要在构造函数中获取存储令牌,那么将其移到另一个异步函数中是没有帮助的。存储函数是一个离子库,它是异步的,所以我无法控制它。那么我可以问一下,如果我应该做些什么来从构造函数内部调用initialize函数。。。或者在现实中,我如何获得存储的令牌。我的意思是,我想我可以有某种“启动”服务,使存储的数据以全局或其他形式提供?i、 e.找到另一种方法:)@BrettJB-参见我添加到答案中的编辑。如果这不是你想要的,你需要告诉我们你想如何获得信息,因为服务不是独立存在的,所以实际的消费者是什么。是的,这会起作用,我将标记为答案,因为你很乐意帮助我。我想我的错误是知道组件、服务等的级别以及它们都适合的位置。尝试一次学习太多东西的麻烦-角度,字体,离子。。。再次感谢,Brett典型的模式是在别处检索值并将其传递给构造函数,或者使用异步调用的“初始化”方法。这与向用户显示某种“正在进行”的指示器(如加载微调器)密切相关。您好,Igor,我在我的问题中添加了一个编辑,我认为它更准确地说明了我的问题。我想知道你能不能给我指个更好解释的地方?再次感谢。。。
constructor( private http: HttpClient,
private storage: Storage,
private alertController: AlertController ) {}
async initialize() {
await this.getBearerToken();
console.log('Have awaited the token and its value is:' + this.BearerToken);
}
async getBearerToken() {
this.BearerToken = await this.storage.get(TOKEN_KEY);
}
constructor( private http: HttpClient,
private storage: Storage,
private alertController: AlertController ) {}
initialize() {
this.getBearerToken().then(_ => console.log('Have awaited the token and its value is:' + this.BearerToken));
}
async getBearerToken() {
this.BearerToken = await this.storage.get(TOKEN_KEY);
}
export class MyComponent implements OnInit {
myBearerToken: any;
constructor(private service: AuthService) { }
async ngOnInit() {
this.myBearerToken = await this.service.getBearerToken();
}
}
async ngOnInit() {
await this.user.getUserStore();
// rest of code