我正在使用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>
答案 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.country
是data
类型的对象,而不是data
仅使用country
。
此外,我不认为从getCountryCode
中的回调中返回数据是有道理的。因为clientDataProfile.getUserCountryCode
返回一个异步操作的promise。在这里,您将不得不采取其他措施来处理这种情况。
getCountryCode() {
return this.clientDataProfile.getUserCountryCode().then(country => {
console.log(country);
});
}
答案 2 :(得分:-1)
更改服务中的getCountryCode的返回定义
getUserCountryCode() : ClientData {
}