【问题标题】:gelocation - asynchronous callback not working with error - Javascript地理定位 - 异步回调无法使用错误 - 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 不带任何参数...所以。

标签: javascript asynchronous geolocation asynccallback


【解决方案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**}); 
    

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 2015-09-13
      • 2015-01-05
      • 2017-05-06
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      相关资源
      最近更新 更多