【问题标题】:jQuery deferred not working for me?jQuery deferred 不适合我?
【发布时间】:2011-08-25 14:25:04
【问题描述】:

我正在尝试使用 jQuery when 函数,以便等到 Ajax 请求完成后再继续,但显然我遇到了问题。

我的控制台输出如下所示:

geocodeMaster
geocode Canary Wharf 
Object
geocode  
Object
address is blank, returning 51.501885 -0.190894
proceeding
Uncaught TypeError: Cannot read property '0' of undefined
Object
Object

最后两个对象是第二次调用geocode 的输出。为什么代码在第二次调用的输出之前显示proceeding

我的代码如下所示:

function geocode(address, geodata) {
    console.log('geocode', address, geodata);
    geodata['street'] = address;
    if (address=="") {
        console.log('address is blank, returning ' + current_latlng[0], current_latlng[1]);
        return [current_latlng[0], current_latlng[1]];  
    }
    $.ajax({
        url: CS_API + 'geocoder.json',
        data: geodata,
        dataType: 'jsonp',
        jsonpCallback: 'places',
        success: function(from_data) {
            console.log(from_data);
            if (from_data.results.result!=undefined){
               var from_result = from_data.results.result;
               console.log(from_result)
               return [from_result.latitude, from_result.longitude];   
            } else {
                return false;
            }
        },
        error: function(data) {
            return false;
        }   
    }); 
}
function geocodeMaster(place_from,place_to) {
    console.log('geocodeMaster');
    geodata['key'] = CS_API_KEY;
    if (current_latlng!=null) {
        geodata['n'] = current_latlng[0] + 0.1;
        geodata['e'] = current_latlng[1] + 0.1;
        geodata['s'] = current_latlng[0] - 0.1;
        geodata['w'] = current_latlng[1] - 0.1;
    }
    var start_coords,finish_coords;
    $.when(start_coords=geocode(place_from,geodata),finish_coords=geocode(place_to,geodata)).then(function(){
console.log('proceeding');
        console.log(start_coords[0],start_coords[1],finish_coords[0],finish_coords[1]);  
    });      
}

问题是提供给when() 的对象不是延迟对象吗?如果是这样,我怎样才能将它们变成 Deferred 对象,同时保留我需要收集的信息 - start_lat 等?

【问题讨论】:

    标签: javascript jquery jquery-deferred


    【解决方案1】:

    您必须从地理编码函数返回一个延迟对象。试试看:

    return $.ajax(..
    

    您不能将返回值直接存储到值中(它不像现在写的那样工作)。您必须将它们存储在其他地方,以便调用 when 的行简单地读取:

    $.when(geocode(place_from,geodata),geocode(....
    

    要解决这个问题,您可以传递给一个空对象进行地理编码,并让该函数将其结果保存在其中,例如:

    var start_coords = {};
    var finish_coords = {};
    $.when(geocode(place_from,geodata,start_coords),geocode(place_to,geodata,finish_coords) ... 
    

    【讨论】:

    • 我很想将它包装在一个函数中,否则我将重复两次 Ajax 地理编码器的所有代码,这并不理想。这有可能吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多