怎么来功能不等待另一个功能

时间:2014-02-26 15:56:19

标签: javascript html function google-maps

我有2个函数,函数A调用函数B对地址进行地理编码并将LatLng对象返回给函数A但不知何故,函数A不等待函数B从Google返回结果。

function A() {
    var address = document.getElementById("txtbox").value;
    //geocoding here
    var here = B(address);
    if (here == null) {
        console.log("seems like geocode didn't work, defaulting value");

和功能B

function B(address) {
    var here;
    geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address}, function(results, status) {
        console.log("geocoding");                                               
        if (status == google.maps.GeocoderStatus.OK) {
            console.log(results[0].geometry.location);
            currentlatlng = results[0].geometry.location;
            lng = currentlatlng.lng();
            lat = currentlatlng.lat();
            here = new google.maps.LatLng(lat, lng);
        } else {
            console.log("Geocode was not successful for the following reason: " + status);
        }
    });

    return here;
}

但似乎控制台的输出是

seems like geocode didn't work, defaulting value
geocoding

因此,似乎函数A调用函数B然后继续它。

我认为它会等待,但是根据我对google maps api如何工作的理解,它本身并没有“等待”,所以我该怎么办?

2 个答案:

答案 0 :(得分:6)

您的地理编码功能是异步的。它不等待。它的结果来自Ajax调用(“Ajax”中的“A”代表异步)。

您无法以同步方式使用异步函数进行编程。相反,您必须使用异步技术。在这种情况下,您获取地理编码信息后要运行的任何代码必须在地理编码操作的完成处理程序中执行或调用。您无法在B()之后执行此操作。您必须在B()内的完成处理程序中执行它。

如果您希望能够将B()用于多种用途,那么您可以将回调传递到B()并在地理编码数据可用时调用该回调。

function A(){
    var address = document.getElementById("txtbox").value;
   //geocoding here
    B(address, function(geocodeData) {
        // use geocode data here
    });
}

function B(address, callback){
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address}, function(results, status) {
         console.log("geocoding");                                              
         if (status == google.maps.GeocoderStatus.OK) {
             console.log(results[0].geometry.location);
             var currentlatlng = results[0].geometry.location;
             var lng = currentlatlng.lng();
             var lat = currentlatlng.lat();
             var here = new google.maps.LatLng(lat, lng);
             // call your callback here and pass it the data
             callback(here);
         }else {
             console.log("Geocode was not successful for the following reason: " + status);
             }
        });
}

仅供参考,你的变量应该被声明为局部变量(前面有var),这在异步函数中更为重要。

答案 1 :(得分:0)

B进行异步调用,这意味着无法保证执行顺序。最好的办法是,在A中注册的回调函数中初始化here之前,执行将在B(长)中进行测试。

基本上,在here初始化之后,必须从回调内部调用here所需的任何内容。看看jquery,这是一个跨浏览器的js库,它使用Deferred对象形式化这种延迟执行模式。特别是它带有ajax方法,用户可定义的回调调用成功和失败。