2012-07-03 2 views
0

Я для своей жизни не могу понять это. Я знаю, что это проблема с асинхронным способом ajax, который вызывает вызовы, но все же не может указать на проблему. У меня есть следующее:рельсы + функция jquery javascript, возвращаемое значение не определено

$(document).ready(function() { 
    $('#address').blur(function() { 
    console.log("now processing address"); 
    var add = $("#address").val(); 
    console.log("address is: " + add); 
    var refAdd = processAddress(add); 
    console.log("refined addres is: " + refAdd); 
    }); 
}); 

И вот у меня есть функция processAddress (благодаря другому сообщению на SO), которое я вызываю. Проблема в том, что последний оператор выше возвращает refAdd как undefined. Почему это??

function processAddress(address){ 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
    geocoder.geocode({ 'address': address }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     //console.log(results[0].geometry.location); 
     console.log(results[0].formatted_address); 
     console.log("latitude is: " + results[0].geometry.location_type); 
     } 
     else { 
     console.log("Geocoding failed: " + status); 
     //formatted_address = "Geocoding failed: " + status; 
     formatted_address = "failed" 
     } 
    }); 
    } 
} 

Это довольно ясный асинхронный вопрос, я могу видеть в порядке вывода вывода; refAdd следует печатать последним, но это не так.

now processing address 
address is: 415 N Mathilda Ave, Sunnyvale 
refined addres is: undefined 
415 N. Mathilda Ave, Sunnyvale, CA, USA 
latitude is: ROOFTOP 
+1

Ваш метод processAddress ничего не возвращает. Конечно, запись возвращаемого значения отображается «undefined», потому что это буквально не определено. –

ответ

0

Вы правы, проблема в том, что функция является асинхронным (как я знаю, что, потому что, как вы сказали: logs написаны асинхронно иgeocoder.geocode использует функцию обратного вызова). Вы должны использовать обратные вызовы, например:

$(document).ready(function() { 
    $('#address').blur(function() { 
    console.log("now processing address"); 
    var add = $("#address").val(); 
    console.log("address is: " + add); 

    // adding callback to call. 
    processAddress(add, function(refAdd) { 
     console.log("refined addres is: " + refAdd); 
    }); 
    }); 
}); 

и функции:

function processAddress(address, callback){ // <---- note the callback arg 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
    geocoder.geocode({ 'address': address }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     //console.log(results[0].geometry.location); 
     console.log(results[0].formatted_address); 
     console.log("latitude is: " + results[0].geometry.location_type); 
     callback('TEST'); // <---- pass here the value you need 
     } 
     else { 
     console.log("Geocoding failed: " + status); 
     //formatted_address = "Geocoding failed: " + status; 
     formatted_address = "failed" 
     callback('TEST'); // <---- pass here the value you need 
     } 
    }); 
    } else { 
    callback(); // <---- pass here for example error if you need 
    } 
}; 

Я не знаю, что это geocoder вещи, так что вам нужно настроить под свои нужды.

+0

Спасибо, причудливый, отлично сработал :) – absolutskyy

Смежные вопросы