Javascript异步函数:回调不工作
我试图从Javascript中的异步函数返回一个结果 我看到了这个问题:,我正在尝试实现回调解决方案,但出现了一些问题 这是我的代码:Javascript异步函数:回调不工作,javascript,ajax,api,http,Javascript,Ajax,Api,Http,我试图从Javascript中的异步函数返回一个结果 我看到了这个问题:,我正在尝试实现回调解决方案,但出现了一些问题 这是我的代码: function getLocation(callback){ var lat; var long; if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) {
function getLocation(callback){
var lat;
var long;
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position)
{
lat = position.coords.latitude;
long = position.coords.longitude;
}, function()
{
console.log('Please enable geolocation in your browser.');
});
} else {
alert('It seems like geolocation is not enabled in your browser.');
}
var res = {
"lat": lat,
"long": long
};
callback(res);
}
function getEventNearYou(){
var list = [];
getLocation(function(obj){
var lat = obj.lat;
var long = obj.long;
$.ajax({
url : 'http://www.skiddle.com/api/v1/events/search/?api_key=myapikey' + '&latitude=' + lat + '&longitude=' + long + '&radius=800&eventcode=LIVE&order=distance&description=1',
type : "GET",
async : false,
success : function(response) {
$(response).find("results").each(function() {
var el = $(this);
var obj = {
"eventname" : el.find("eventname").text(),
"imageurl" : el.find("imageurl").text(),
}
list.push(obj);
});
}
});
return list;
});
}
基本上,我想找到我的当前位置,并创建一个到www.skiddle.com的HTTP get请求,以检索该位置附近的事件
这就是我调用函数的方式:
var x = getEventNearYou();
getEventNearYou(function (events) {
// code which relies on `events` can be called from here
});
但是我似乎犯了一个错误,因为我得到了错误的请求错误(
lat
和long
未定义)。您使用回调的方式破坏了它们的有用性。您仍在以同步方式编写代码。您应继续参考:
同时,我将重新构造您的代码,以展示它是如何完成的
async:false
getEventNearYou
:
var x = getEventNearYou();
getEventNearYou(function (events) {
// code which relies on `events` can be called from here
});
只是对4castle的优秀答案再加一点解释。在您编写的代码中,当在Javascript中调用
getLocation()
函数时,将发生以下情况:
var-lat
和var-long
用undefined
的值实例化res
对象使用lat
和long
的当前未定义值进行实例化。也就是说,res
是:{“lat”:未定义,“long”:未定义}
res
上调用回调
函数。这意味着调用callback
时使用了lat
和long
的未定义值navigator.geolocation.getCurrentPosition()
最终完成了它所做的工作,并将值分配给lat
和long
,但是现在已经太晚了,因为您的回调函数已经被调用了未定义的值在4castle修改后的代码中,步骤4-5被放在一个匿名回调函数中,指向
navigator.geolocation.getCurrentPosition()
,这意味着这些行在getCurrentPosition()
完成获取位置之前不会执行。什么是obj
是getLocation
的参数?在success
中重新定义obj
的目的是什么?似乎navigator.geolocation.getCurrentPosition
具有回调函数。因此,在您得到回调之前,运行callback(res)代码>将被执行。这就是为什么您不会获得lat
和long
值的原因。@dwij建议如何处理此问题?请尝试回调(res)代码>内部navigator.geolocation.getCurrentPosition
成功函数。此外,您还需要将res
变量赋值推到成功function@dwij这对请求很有帮助,现在可以了,但是我想从getEventNearYou()
返回的对象列表仍然没有定义。