Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 打字稿';等待&x27;不';你似乎等不及了?_Angular_Typescript_Ionic Framework - Fatal编程技术网

Angular 打字稿';等待&x27;不';你似乎等不及了?

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

请原谅noobie的错误,我是从C#背景来的,所以这可能是问题的一部分。 我试图从Ionic storage中获取一个存储的令牌,但我很难理解承诺和。然后决定使用“等待”,因为我习惯了c#中的“等待”

这是我想要构造的Api服务的一部分,因此需要按顺序获取http头,因此在构造函数中,我检索令牌以将其添加进去。 以下是Api服务TS文件的一部分:

      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