将Google地图自动填充预测返回到调用它的方法

时间:2016-03-10 18:05:49

标签: javascript google-maps-api-3

我有一个javascript方法addressAutocomplete,只要输入字段发生变化,就会调用它。在其中我调用谷歌地图方法来根据当前输入获得预测。

我的问题是我希望我的addressAutocomplete方法返回预测,而我无法找到实现此目的的方法。最好的方法是什么?

我的代码(回复不起作用)

var addressAutocomplete = function(input) {
  var service = new google.maps.places.AutocompleteService();
  return service.getQueryPredictions({ input: input }, predictionsCallback);
};

function predictionsCallback(predictions, status) {
  if (status != google.maps.places.PlacesServiceStatus.OK) {
    alert(status);
    return;
  }

  return predictions;
}

2 个答案:

答案 0 :(得分:1)

您目前获得undefined,对吗?问题是你试图从异步操作中返回值,这些操作不会起作用。在predictions调用回调函数之前,您无法访问getQueryPredictions,并且无法从回调函数返回值。 service.getQueryPredictions没有返回值,它只是在异步操作完成时调用回调函数。

我不确定如果没有更多的上下文(例如调用或注册addressAutocomplete的地方)我可以进一步帮助你。你需要的是使用连续传递风格或者可能使用promises。 #39;描述你可能需要做的事情:

var addressAutocomplete = function(input) {
  var service = new google.maps.places.AutocompleteService();

  //you can't return this line because it's an async function
  service.getQueryPredictions({ input: input }, function (predictions, status) {
    if (status != google.maps.places.PlacesServiceStatus.OK) {
      alert(status);
    }
    //again, we can't return a value here, but we can pass it to another function!
    // this is not exactly how you should do it, just an example
    // Only stringifying it here for example, since I don't know the shape of the predictions object
    $('.autocomplete-results').text(JSON.stringify(predictions));
  });
};

编辑:只需将文本添加到DOM即可。在这里,我抓住了我想用jquery更新的元素,然后将其文本设置为字符串化的预测对象。我不知道预测是什么样的,但是你可能想要定义一个辅助函数来解析和格式化文本,然后更新DOM。

答案 1 :(得分:1)

这可能不是最好的方法,但是现在这就是我的工作方式。如果您有更好的解决方案,请告诉我。

var addressPredictions;

var addressAutocomplete = function(input) {
  var service = new google.maps.places.AutocompleteService();
  service.getQueryPredictions({ input: input }, predictionsCallback);

  return addressPredictions;
};

function predictionsCallback(predictions, status) {
  if (status != google.maps.places.PlacesServiceStatus.OK) return;

  addressPredictions = predictions;
}