JQuery отложенный не работает для меня? - PullRequest
0 голосов
/ 25 августа 2011

Я пытаюсь использовать функцию 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(), не являются отложенными объектами? Если да, как я могу превратить их в отложенные объекты, сохраняя информацию, которую мне нужно собрать - start_lat и т. Д.

1 Ответ

0 голосов
/ 25 августа 2011

Вы должны вернуть отложенный объект из функции геокодирования. Попробуйте:

return $.ajax(..

Вы не можете сохранять возвращаемое значение непосредственно в значениях (это не работает так, как сейчас). Вы должны хранить их где-то еще, так что строка, которая вызывает, когда просто читает:

$.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) ... 
...