簡體   English   中英

地理位置-異步回調無法處理錯誤-Javascript

[英]gelocation - asynchronous callback not working with error - Javascript

myFn.getMyCurrentPosition(data,function(data){//異步調用,需要像回調一樣使用數據-本節不起作用,如何使用當前位置坐標並將其用於其他函數(如成功回調)中?

var myFn = {
    this.localVar : null, 
    mysuccess : function (position) {
        this.myLocalVar = position.coords.latitude + ','+ position.coords.longitude; 
        return this.myLocalVar; 
    }, 
    myerror : function (error) {     
        return null; 
    }, 
    getMyCurrentPosition : function() {
        if(navigator && navigator.geolocation) { 
            //WORKS - mysuccess sets data asyncrhonously. 
            return navigator.geolocation.getCurrentPosition(this.mysuccess, this.myerror);          
        }
    }, 
    myInitializer : function(){
        //Initialize map, marker etc. for google maps API
        myFn.getMyCurrentPosition( function(){ //Async call, need to use data like a callback 
            //This code never runs! 
            if(this.myLocalVar){
                //doSomethingAfterCall - using this.myLocalVar, map, etc.;

            }
        });
    }
}

更新:嘗試此:

var myFn = {
    mysuccess: function (position) {
        myFn.myInitializer(); 
    }, 
    myerror: function (error) { 
        myFn.myInitializer(); 
    }, 

     myInitializer : function(){
        //Initialize map, marker etc. for google maps API
    }, 
    onLoadSet : function(){
        navigator.geolocation.getCurrentPosition(this.mysuccess, this.myerror);
    }

} 

myFn.onLoadSet(); 

得到此錯誤:無法在“地理位置”上執行“ getCurrentPosition”:作為參數1提供的回調不是函數。

調用myFn.getMyCurrentPosition ,將向其傳遞兩個參數( data和函數)。

定義時:

 function() { 

您沒有告訴它接受任何參數(也沒有使用arguments對象)。

如果您想對它們進行任何處理,則需要實際使用傳遞給它的參數。

嘗試類似新的Permission API的方法
我已經構建了它的擴展版本/ polyfill,並支持請求和查詢地理位置的狀態,這一切都應運而生: browser-su

/***************
 *    query    *
 ***************/
su.query({
    name: 'geolocation'
}).then(permission => {
    console.log(permission) // {state, onchange}
    console.log(permission.state) // granted, prompt or denied
})


/***************
 *   request   *
 ***************/
su.request({
    name: 'geolocation',
    timeout: 5000 // Optional
}).then(position => {
    console.log(position)
} err => {
    console.log(err.name, err.message)
    // RequestDeniedError       User blocked access to geolocation
    // RequestDismissedError    User dismissed access to geolocation
    // RequestTimeoutError      Timeout expired
    // RequestUnavailableError  Position is unavailable
    // RequestUnsupportedError  This client dose not seem to have geolocation support
})

Firefox也將很快支持撤銷權限

這是有效的。 我嘗試了另一種方法,但是可能在語法上弄亂了某些內容。 這有兩個問題:JS需要在成功/錯誤回調中為myInitializer調用引用變量myFn.method而不是this.method。 因為locationSuccess / error是預期的回調,所以this.locationSucess在getcurrentPosition的回調中起作用。

var myFn = {
    locationSuccess: function (position) {
        myFn.myInitializer(position.coords); 
    }, 
    locationError: function (error) {  
        myFn.myInitializer();  
    }, 

     myInitializer : function(data){
        //Initialize map, marker etc. for google maps API
       //if(data) { doSomething(); }
       //else { doSomethingElse(); }

    }, 
    onLoadSet : function(){
        navigator.geolocation.getCurrentPosition(this.locationSucess, this.locationError, {timeout:1000});
    }

};

myFn.onLoadSet(); 

另一個問題是已知的:將超時作為第三個參數添加到

navigator.geolocation.getCurrentPosition(this.locationSuccess, this.locationError, {**timeout:1000**}); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM