gelocation - 异步回调无法使用错误 - Javascript

时间:2016-05-18 19:55:31

标签: javascript asynchronous geolocation asynccallback

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' on' Geolocation':作为参数1提供的回调不是函数。

3 个答案:

答案 0 :(得分:2)

当你致电myFn.getMyCurrentPosition时,你会传递两个参数(data和一个函数)。

当你定义它时:

function() {

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

如果您想要对它们进行任何操作,您需要实际使用传递给它的参数。

答案 1 :(得分:1)

尝试新的Permission api之类的内容 我已经构建了一个扩展版本/ polyfill,支持request&查询地理位置的状态都是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也很快会支持撤销权限

答案 2 :(得分:0)

这是有效的。我尝试了另一种方法,但可能在我的语法中弄乱了一些东西。这是几个问题: JS需要在成功/错误回调中为myInitializer调用引用变量myFn.method而不是this.method。因为locationSuccess / error是预期的回调,所以this.locationSucess在getcurrentPosition的回调中工作。

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

另一个问题是:添加超时作为

的第三个参数
J4