异步javascript函数

时间:2015-02-16 05:03:59

标签: javascript google-maps google-maps-api-3

所以我试图调用谷歌地理编码器来获取一些值,但我不完全理解我能在异步函数领域内做什么和不能做什么。在SO上还有另一个例子帮助我这样设置,但我仍然无法弄清楚如何将这些值放入数组中

以下是我对地理编码器的调用:

function getLng(name,func){
     geocoder.geocode( {'address': name}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        func(results[0].geometry.location.lng());
      } else {
        alert("Something got wrong " + status);
      }
    });
}  

这是使用地理编码器值构建数组:

('.action').click(funciton(){
     var homes =[];
     homes.push({name: Name,
                type: "dwelling",
                lat: getLat(Name, function(location){return location;}),
                lng: getLng(Name, function(location){return location;})
            });
  console.log(homes);
});

真诚地感谢您的帮助......非常感谢。

2 个答案:

答案 0 :(得分:0)

异步函数不会立即返回结果,它们通常通过发出事件,将回调作为参数传递或返回promise对象来工作。 在您的示例中,您将传递一个回调,该回调将其参数返回到void。

此外,您不希望为同一地址调用地理编码器API两次。

声明的更好的功能是:

function getGeoLocation(address, onDoneCallback) { ... }
...
var homes = [];
getGeoLocation(some_address, function(loc) {
    homes.push({lat : loc.lat, lng : loc.lng});
});

希望这有帮助。

答案 1 :(得分:0)

使用async方法意味着重新思考如何对事件进行编码。使用async意味着代码永远不会等待方法完成,而是立即向前移动到下一行。这意味着您必须将分配代码(homes = ...)移动到成功处理程序

请注意,click事件现在仅限于调用getGeoCoords函数。 此函数现在有一个名为onSuccess的回调方法,它负责根据异步查询的结果构建homes对象

var homes = [];

('.action').click(function(){
    getGeoCoords(Name, 'dwelling');
});

function getGeoCoords(name, type){

    var onSuccess = function(results){
        var home = {};

        home.name = name;                   // getGeoCoods parameter 'name'
        home.type = type;                   // getGeoCoods parameter 'type'
        home.lat  = results.lat;            // result of async query
        home.lng  = results.lng;            // result of async query

        homes.push(home);                   // push object to global array 
    }

    geocoder.geocode( 
        {'address': name},                  // async query options
        onSuccess                           // success callback
    );
}