Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 在Ionic 4中处理异步和存储以进行api调用_Angular_Ionic Framework - Fatal编程技术网

Angular 在Ionic 4中处理异步和存储以进行api调用

Angular 在Ionic 4中处理异步和存储以进行api调用,angular,ionic-framework,Angular,Ionic Framework,在我的应用程序中,我保存了一个令牌,用于使用离子存储连接api,但我不知道这是处理异步的正确形式,因为我没有在正确的时间获取令牌来调用api player.page.ts ngOnInit() { this.playerService.getPlayers().subscribe(data => { this.players = data; }); } global.service.ts getToken(){ this.storage.get

在我的应用程序中,我保存了一个令牌,用于使用离子存储连接api,但我不知道这是处理异步的正确形式,因为我没有在正确的时间获取令牌来调用api

player.page.ts

ngOnInit() {
    this.playerService.getPlayers().subscribe(data => {
      this.players = data;
    });
  }
global.service.ts

  getToken(){
    this.storage.get(this.token_key).then((val) => {
      this.token = val;
    })
    return this.token;
  }
  getPlayers() {
    return this.api.get('GetPlayers');
  }
 getHeaders() {
    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + this.global.getToken()
      })
    };
    return httpOptions;
  }

  get(route:any)
  {
    return this.http.get(this.global.urlAPI + route , this.getHeaders());
  }
player.service.ts

  getToken(){
    this.storage.get(this.token_key).then((val) => {
      this.token = val;
    })
    return this.token;
  }
  getPlayers() {
    return this.api.get('GetPlayers');
  }
 getHeaders() {
    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + this.global.getToken()
      })
    };
    return httpOptions;
  }

  get(route:any)
  {
    return this.http.get(this.global.urlAPI + route , this.getHeaders());
  }
api.service.ts

  getToken(){
    this.storage.get(this.token_key).then((val) => {
      this.token = val;
    })
    return this.token;
  }
  getPlayers() {
    return this.api.get('GetPlayers');
  }
 getHeaders() {
    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + this.global.getToken()
      })
    };
    return httpOptions;
  }

  get(route:any)
  {
    return this.http.get(this.global.urlAPI + route , this.getHeaders());
  }

在global.service.ts中,在函数getToken中,当承诺被解析时,您将为this.token赋值,但您应该返回如下承诺-

getToken() {
    return this.storage.get(this.token_key);
}
然后在电话里-

getToken().then((value) => {
    //do assignment here
}
您当前执行此操作的方式将始终从函数返回值,即使在承诺得到解决之前也是如此

编辑:根据你的评论。您希望在承诺解决后返回一个值。由于您不能从承诺内部执行此操作,所以您可以做的是使函数异步并使用wait执行赋值。然后返回您的对象,如-

async getHeaders() {
    const httpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + await this.global.getToken()
        })
    };
    return httpOptions;
}
然后,在任何需要的地方调用此函数-

getHeaders().then((value) => {
    console.log(value);
});

因为异步函数总是返回一个承诺。您也可以使用承诺链接,但我认为这种方法更简洁

我理解您的意思,但仍然没有意识到如何将其分配到我想要返回的内容中。我现在把它放在头上:getHeaders{let token;this.global.getToken.thenvalue=>{token=value;};const-httpOptions={headers:new-HttpHeaders{'Content-Type':'application/json','Authorization':'Bearer'+token};return-httpOptions;}但不起作用,我怎样才能把那口井还回去?我想返回标题。请检查答案。我已经根据你的评论更新了谢谢@PawanSharma,这很有帮助!