Javascript 尝试连接另一个字符串时,字符串值变得未定义

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

我正在练习OpenWeatherMapAPI。我有一个坐标对象,它的键lat和lon等于一个字符串。当我将coord obj传递到另一个函数中,并尝试使用api调用字符串连接这些字符串时,它们将变得未定义。我以为我把这些变量的范围设为全局的,但事实似乎并非如此。有人能告诉我这个代码有什么不正确吗

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;
}