地理定位 - 异步回调无法使用错误 - Javascript

Posted

技术标签:

【中文标题】地理定位 - 异步回调无法使用错误 - Javascript【英文标题】:gelocation - asynchronous callback not working with error - Javascript 【发布时间】:2016-05-18 19:55:30 【问题描述】:

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 提供的回调不是函数。

【问题讨论】:

getMyCurrentPosition 不带任何参数...所以。 【参考方案1】:

当您调用 myFn.getMyCurrentPosition 时,您会传递两个参数(data 和一个函数)。

当你定义它时:

function() 

你没有告诉它接受任何参数(你也没有使用arguments 对象)。

如果你想对它们做任何事情,你需要实际使用你传递给它的参数。

【讨论】:

感谢您的帮助。实际上我不需要传递任何东西,只需使用返回的位置坐标即可。我还有一些调用 getMyCurrentPosition 的局部变量,所以我想使用它们和位置坐标。有没有办法做到这一点。所以基本上,我只需要设置位置/数据后的回调,即获取返回的数据,而不传递任何东西。? var map =something; myFn.getMyCurrentPosition( function(data) //data 需要是位置 - lat/long... ); 没有返回坐标。这是一个异步函数。您不能从异步函数返回。这就是我们传递回调的原因。 你能告诉我如何传递/使用回调,这是我正在努力工作的部分。拿到位置后我有一堆功能,但只有返回位置成功才需要运行。 所以在成功回调中,我必须移动我在成功时尝试做的任何事情?我真的不能按照我的方式写出来吗?让我试试看。【参考方案2】:

尝试类似新的Permission api 我已经构建了它的扩展版本/polyfill,支持请求和查询地理位置的状态 all promisify: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 也将很快支持撤销权限

【讨论】:

【参考方案3】:

这是有效的。我尝试了另一种方法,但可能在我的语法中搞砸了一些东西。这是几个问题: 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**); 

【讨论】:

以上是关于地理定位 - 异步回调无法使用错误 - Javascript的主要内容,如果未能解决你的问题,请参考以下文章

使用 html5 进行地理定位

无法在 Android 4.4 中使用 HTML5 地理定位

Android手机上的错误“无法启动地理定位服务代码:2”

如何检测地理定位的负面用户响应

减少地理定位 watchPosition 调用的频率

Ionic 4 本机插件地理定位给了我“找不到模块:错误:无法解析 'rxjs/Observable'”