Почему эта функция всегда возвращает «неопределенный» - PullRequest
1 голос
/ 28 мая 2009
function getLongLat(address)
{
geocoder = new GClientGeocoder();
if (geocoder) {
       geocoder.getLatLng(address,
         function(point) {
           if (!point) {
             return "null";
           } else {          
         return point;
           }
         }
       );
     }
}   

Если я поставлю предупреждение (точку), я получу долготу и широту.

Ответы [ 4 ]

4 голосов
/ 28 мая 2009

Попробуйте это: D

function getLongLat(address)
{
        geocoder = new GClientGeocoder();
        if (geocoder) {
           return geocoder.getLatLng(address,
             function(point) {
               if (!point) {
                return "null";
               } else {          
                    return point;
               }
             }
           );
        }
        return false;
 }
3 голосов
/ 28 мая 2009

Это потому, что ваша функция не имеет оператора возврата.

Внутренняя функция, которая вызывается как параметр для geocoder.getLatLng, имеет оператор return, что вас смущает. Я предлагаю вам извлечь внутреннюю функцию, чтобы уменьшить запутанные аспекты.

Попробуйте это:

function convert_to_null_if_falsy(value) {
    return value || "null";
}    

function getLongLat(address) {
    geocoder = new GClientGeocoder();
    return geocoder.getLatLng(address, convert_to_null_if_falsy);
}

Я не уверен, почему вы хотите вернуть строку "null" вместо undefined в вашей функции обратного вызова, но этот код делает то же самое с гораздо меньшими хлопотами.

1 голос
/ 28 мая 2009

Имейте в виду, что getLatLng () является асинхронным: вы передаете анонимную функцию для выполнения после завершения.

Ваша функция getLongLat () не сможет вернуть точку в этом случае, потому что эта анонимная функция работает в совершенно ином контексте асинхронно: ваша функция будет выполняться и возвращаться раньше, чем пожелает Google, а точка даже не будет область для внешней функции.

Вам нужно будет вызывать любой код, который вы хотите использовать для точек внутри этой анонимной функции:

function getLongLat(address)
{
    geocoder = new GClientGeocoder();
    if (geocoder) {
       return geocoder.getLatLng(address,
         function(point) {
           // point is only in scope for this anonymous inner function
           // which is called when your request to Google's service completes
           if (!point) {
              // your error condition if a point isn't found
              // omgMissingPoint(point);
           } else {          
              // your function to process points here.
              // processPoint(point);
           }
         }
       );
    }

}

1 голос
/ 28 мая 2009

Что если geocoder не true ? И geocoder.getLatLng также не возвращает никакого значения.

Так что заставьте оба вернуть что-то, возможно:

function getLongLat(address) {
    geocoder = new GClientGeocoder();
    if (geocoder) {
        return geocoder.getLatLng(address, function(point) {
            if (!point) {
                return "null";
            } else {
                return point;
            }
        });
    }
    return "null";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...