地理定位 - 异步回调无法使用错误 - 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的主要内容,如果未能解决你的问题,请参考以下文章