Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript异步函数:回调不工作_Javascript_Ajax_Api_Http - Fatal编程技术网

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) {

我试图从Javascript中的异步函数返回一个结果

我看到了这个问题:,我正在尝试实现回调解决方案,但出现了一些问题

这是我的代码:

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
    的值实例化
  • 调用了navigator.geolocation.getCurrentPosition(),这需要很长时间才能完成
  • 与此同时,Javascript会寻找其他事情来做,并移动到函数的下一行
  • 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()
    返回的对象列表仍然没有定义。