Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

geo = function(options){
    geocoder.geocode( options, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var x = results;
            alert('pear');
            return x;
        } else {
            return -1;
            }
        });
    }

getAddr = function(addr){
    if(typeof addr != 'undefined' && addr != null) {
        var blah = geo({ address: addr, });
                    alert('apple');
                    return blah;
    }
    return -1;
}

So when I call getAddr I get undefined, also apple is alerted first and then pear. I realize that google maps geocodes asynchronously, but is there a way to make this work?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
431 views
Welcome To Ask or Share your Answers For Others

1 Answer

You will not be able to do it that way. You have an asynchronous call to google's geocoder, which means you will not be able to have the getAddr return the results. Instead you should do something like this:

getAddr = function(addr, f){
    if(typeof addr != 'undefined' && addr != null) {
        geocoder.geocode( { address: addr, }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            f(results);
          }
        });
    }
    return -1;
}

And then you use in your code like that:

getAddr(addr, function(res) {
  // blah blah, whatever you would do with 
  // what was returned from getAddr previously
  // you just use res instead
  // For example:
  alert(res);
});

EDIT: If you want to you could also add more status validation:

getAddr = function(addr, f){
    if(typeof addr != 'undefined' && addr != null) {
        geocoder.geocode( { address: addr, }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            f('ok', results);
          } else {
            f('error', null);
          }
        });
    } else {
      f('error', null);
    }
}

And you can use it like that:

getAddr(addr, function(status, res) {
  // blah blah, whatever you would do with 
  // what was returned from getAddr previously
  // you just use res instead
  // For example:
  if (status == 'ok') {
    alert(res);
  } else {
    alert("Error")
  }
});

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...