我必须在loc()方法中使用lat和long并在组件中注入loc()每当我检查它时总是给我undefined,我是js的新手,所以相应地回答.. :-)
@Injectable()
导出类WheatherService {private req:any;
构造函数(私有http:Http){}
loc(){
返回this.http.get('https://api.openweathermap.org/data/2.5/weather?lat= ' + lat + '&lon = ' + long + '&APPID = d9c05681b9c98fd7185573a204400f74&units = metric') . map(response => response.json());
}
var lat;
var long
function onSuccess(position){
lat = position.coords.latitude;
long = position.coords.longitude;
}
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(onSuccess);
console.log(lat, long);
}
}
2 回答
首先,在调用
onSuccess
之前调用console.log
. 我们可以在致电onSuccess
之后移动console.log
:您可以在日志记录之前定义函数
onSuccess
,但在日志记录之后才能调用它 .console.log
只发生一次 .然而,伐木仍然赢得了't work as expected. This is because of JavaScript' s concurrency model . 在处理异步事件之前,JavaScript函数运行完成 . 也就是说代码将按以下顺序运行:
由于
onSuccess
直到此代码块完成后才运行,因此在异步getCurrentPosition
完成获取当前位置之后才会设置lat
和long
.您可以将
console.log
移动到onSuccess
进行检查 .依赖于
lat
和long
的任何东西都必须依赖onSuccess
. 你不能真正使用lat
和long
作为全局变量 .在函数调用(或)后使用promise来解决此问题 .
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(的onSuccess); console.log(lat,long);
}
使用承诺:
注意:导航API有时取决于浏览器支持或协议(https),请检查您的应用是否具有位置访问权限 .