首页 文章

变量lat和long没有设置为全局变量它们不包含函数中的值赋值它总是在我检查它时给我undefined

提问于
浏览
0

我必须在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 回答

  • 0

    首先,在调用 onSuccess 之前调用 console.log . 我们可以在致电 onSuccess 之后移动 console.log

    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(onSuccess);
    }
    console.log(lat, long);
    

    您可以在日志记录之前定义函数 onSuccess ,但在日志记录之后才能调用它 . console.log 只发生一次 .

    然而,伐木仍然赢得了't work as expected. This is because of JavaScript' s concurrency model . 在处理异步事件之前,JavaScript函数运行完成 . 也就是说代码将按以下顺序运行:

    1. if (navigator.geolocation) {
    2.   navigator.geolocation.getCurrentPosition(
    4.     onSuccess
         )
       }
    3. console.log(lat, long);
    

    由于 onSuccess 直到此代码块完成后才运行,因此在异步 getCurrentPosition 完成获取当前位置之后才会设置 latlong .

    您可以将 console.log 移动到 onSuccess 进行检查 .

    依赖于 latlong 的任何东西都必须依赖 onSuccess . 你不能真正使用 latlong 作为全局变量 .

  • 0

    在函数调用(或)后使用promise来解决此问题 .

    if(navigator.geolocation){

    navigator.geolocation.getCurrentPosition(的onSuccess); console.log(lat,long);

    }

    使用承诺:

    var pro=new Promise((resolve,reject)=>{
    var lat;
    
    var long;
    
    function onSuccess(position) {
    
       lat = position.coords.latitude;
    
       long = position.coords.longitude;
       resolve({lat:lat,long:long})
     }
    
     if (navigator.geolocation) {
    
       navigator.geolocation.getCurrentPosition(onSuccess);
    
     }
    });
    
    pro.then((data)=>{
      console.log(data.lat,data.long);
    })
    

    注意:导航API有时取决于浏览器支持或协议(https),请检查您的应用是否具有位置访问权限 .

相关问题