Javascript функция возврата значения проблемы - PullRequest
3 голосов
/ 30 октября 2009

Я пытаюсь работать с API карт Google, и у меня возникли некоторые проблемы. Я создал функцию с именем getPoint, которая принимает адрес. Он использует API Google для преобразования этого адреса в объект GPoint с помощью функции GClientGeocoder.getLatLng (address, callback). GetLatLng () передается адрес и функция обратного вызова, как вы можете видеть ниже. Я хочу, чтобы написанная мной функция getPoint () возвращала переменную "point", переданную в функцию обратного вызова из вызова getLatLng (). Я изо всех сил пытаюсь выяснить, как это сделать, или даже если это можно сделать?

function getPoint(address) {
  var geocoder = new GClientGeocoder();

  return geocoder.getLatLng(
    address,
    function(point){
      return point;
    }
  );
}

Заранее спасибо за помощь!

Ответы [ 3 ]

6 голосов
/ 30 октября 2009

GClientGeocoder.getLatLng является асинхронной операцией , поэтому вы не можете иметь оператор return в getPoint на самом деле делать то, что ожидаете.

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

function getPoint(address, callback) {
    var geocoder = new GClientGeocoder();

    geocoder.getLatLng(
        address,
        function(point){
            /* asynch operation complete.
             * Call the callback with the results */
            callback(point)
        }
    );
}

или даже лучше (хотя и немного более эзотерически):

function getPoint(address, callback) {
    var geocoder = new GClientGeocoder();

    geocoder.getLatLng(
        address,
        callback // GClientGeocoder will call the callback for you
    );
}

Редактировать Ваш вопрос к комментарию:

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

var map = new GMap2(/*...*/);
var addresses = []; // list of address strings
for(var i=0; i < addresses.length; i++) {
    getPoint(addresses[i], function(point) { // pass the callback function
        map.addOverlay(/*...*/); // map variable is in scope
    })
}

Этот стиль функции называется замыканием.

2 голосов
/ 30 октября 2009

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

Итак, в настоящее время ваш дизайн выглядит так:

var myPoint = getPoint(theAddress);
doSomethingWithPoint(myPoint);
doSomethingElseWithPoint(myPoint);

Но теперь это должно выглядеть

function getPoint(address, callback) {
    var geocoder = new GClientGeocoder();
    geocoder.getLatLng(address, callback);
}
getPoint(theAddress, function(myPoint) {
    doSomethingWithPoint(myPoint);
    doSomethingElseWithPoint(myPoint);
});
0 голосов
/ 30 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...