Javascript 尝试连接另一个字符串时,字符串值变得未定义
我正在练习OpenWeatherMapAPI。我有一个坐标对象,它的键lat和lon等于一个字符串。当我将coord obj传递到另一个函数中,并尝试使用api调用字符串连接这些字符串时,它们将变得未定义。我以为我把这些变量的范围设为全局的,但事实似乎并非如此。有人能告诉我这个代码有什么不正确吗Javascript 尝试连接另一个字符串时,字符串值变得未定义,javascript,api,scope,global-variables,Javascript,Api,Scope,Global Variables,我正在练习OpenWeatherMapAPI。我有一个坐标对象,它的键lat和lon等于一个字符串。当我将coord obj传递到另一个函数中,并尝试使用api调用字符串连接这些字符串时,它们将变得未定义。我以为我把这些变量的范围设为全局的,但事实似乎并非如此。有人能告诉我这个代码有什么不正确吗 var apikey = '9575f3355ae129dc91424b5712a7695e'; var coords = {}; var accessOWM=''; function myLocat
var apikey = '9575f3355ae129dc91424b5712a7695e';
var coords = {};
var accessOWM='';
function myLocation(){ navigator.geolocation.getCurrentPosition(function(position) {
coords.lat = (Math.round(position.coords.latitude*100)/100).toString();
coords.lon = (Math.round(position.coords.longitude*100)/100).toString();
});
}
function changeAccess(coordObj, key){
console.log(coordObj);
accessOWM ='http://api.openweathermap.org/data/2.5/forecast?lat='+coordObj['lat']+'&lon='+coordObj['lon']+'&APPID='+key;
}
myLocation();
console.log(coords);
changeAccess(coords, apikey);
console.log(accessOWM);
异步代码有问题
navigator.geolocation.getCurrentPosition(successCallback)
函数是一个异步函数,不会立即执行successCallback
。这就是为什么当您调用console.log(coords)
和changeAccess(coords,apiKey)
时,还没有定义coords。您需要从.getCurrentPosition()
回调内部调用这些函数(以及最后一个函数)。因为coords是在changeAccess的父范围内声明的,所以不需要将coordObj传递给changeAccess。您是否尝试过:
accessOWM ='http://api.openweathermap.org/data/2.5/forecast?lat='+ coords.lat + '&lon=' + coords.lon + '&APPID='+key;
这是因为该方法是异步的。这意味着调用changeAccess
函数时,不会调用getCurrentPosition
的回调。因此,您必须将changeAccess
调用放入getCurrentPosition
的回调中:
function myLocation() {
navigator.geolocation.getCurrentPosition(function(position) {
coords.lat = (Math.round(position.coords.latitude*100)/100).toString();
coords.lon = (Math.round(position.coords.longitude*100)/100).toString();
});
changeAccess(coords, apikey);
}
或者
或
那是因为它是异步的。因此,当您调用
changeAccess
getCurrentPosition
时,尚未完成。您必须将changeAccess
调用放入getCurrentPosition
callback为什么需要字符串?javascript可以处理这个问题谢谢大家,我总是很难记住什么时候函数调用是异步的,以及如何正确导航。@Rawle Juglal如果这个答案能解决你的问题,你可以投票支持它。
var apikey = '9575f3355ae129dc91424b5712a7695e';
var accessOWM;
function round(v){ return Math.round(v*100)/100 }
function myLocation(){
navigator.geolocation.getCurrentPosition(function(position){
changeAccess(position.coords);
});
}
function changeAccess(coords){
console.log(coordObj);
accessOWM ='http://api.openweathermap.org/data/2.5/forecast?lat=' + round(coords.latitude) + '&lon=' + round(coords.longitude) + '&APPID=' + apikey;
console.log(accessOWM);
}
myLocation();
var apikey = '9575f3355ae129dc91424b5712a7695e';
var accessOWM = myLocation().then(changeAccess);
accessOWM.then(function(v){
console.log(v);
})
function round(v){ return Math.round(v*100)/100 }
function myLocation(){
return new Promise(function(resolve){
navigator.geolocation.getCurrentPosition(function(position){
resolve(position.coords);
});
});
}
function changeAccess(coords){
return 'http://api.openweathermap.org/data/2.5/forecast?lat=' + round(coords.latitude) + '&lon=' + round(coords.longitude) + '&APPID=' + apikey;
}