我无法访问promise的object属性

时间:2017-12-26 04:15:43

标签: angular ionic3 es6-promise

我正在使用promises创建一个离子3应用程序。在我的提供者中,我有这样的承诺:

getUserCountryCode() {
    return new Promise(resolve => {
      this.http.get<ClientData>("https://ipinfo.io/json").subscribe(data => {
        let country = {
             code: data.country,
             city: data.city,
             ip:   data.ip
        }
        resolve(data.country);

      }, err => {
        console.log(err);
      });
    });

在我的header.ts模块中,我有这个代码来使用promise:

 getCountryCode() {
   return  this.clientDataProfile.getUserCountryCode()
     .then(data => {

     return data.country; 
       //error Property country does not exist on type {}

    });
  }

我只是无法获得类型概念。我有和没有:

interface ClientData {
  city: string,
  country: string,
  ip: string
}

我只需要国家属性....但是数据的任何属性上面的错误.....我知道我遗漏了一些非常基本的东西可以有人对此有所了解.....谢谢< / p>

3 个答案:

答案 0 :(得分:1)

界面不是问题所在。问题是您正在解决data.country getUserCountryCode返回一个字符串

// the argument provided to resolve becomes data in getCountryCode
// as data.country is a string, you don't need to return data.country
// in getCountryCode
resolve(data.country);

因此,在header.ts文件中,您需要将功能更改为仅返回data,因为data只是一个 字符串,因为您刚刚使用getUserCountryCode解决了data.country函数中的承诺 反过来成为data getCountryCode函数中的getCountryCode(): string { // data here is a string. It contains country code return this.clientDataProfile.getUserCountryCode() .then((data: string) => data); }

getUserCountryCode

toPromise功能中,您可以使用subscribe like this而非使用window.onload = () => { // run in onload setTimeout(() => { // onload finished. // and execute some code here like stat performance. }, 10) } 在承诺里面。

答案 1 :(得分:0)

getUserCountryCode()函数中,您正在解析country对象的数据。因此,在getCountryCode语句的回调中,您将获得country对象。由于data.countrydata类型的对象,而不是data仅使用country

此外,我不认为从getCountryCode中的回调中返回数据是有道理的。因为clientDataProfile.getUserCountryCode返回一个异步操作的promise。在这里,您将不得不采取其他措施来处理这种情况。

 getCountryCode() {
    return this.clientDataProfile.getUserCountryCode().then(country => {
         console.log(country); 
    });
 }

答案 2 :(得分:-1)

更改服务中的getCountryCode的返回定义

getUserCountryCode() : ClientData {

}