在javascript

时间:2015-10-29 05:12:02

标签: javascript ruby-on-rails ruby google-maps-api-3

我有一个函数可以返回两点中的哪一点更接近第三点:

//returns true if address1 is closer to address0 than address2
function closer(address0,address1,address2) {
    console.log(getDistance(address0,address2) + "fun from closer")
    var d1 = getDistance(address0,address2)
    console.log(address0+" "+address2+" "+d1)
    var d2 = getDistance(address0,address1)
    console.log(address0+" "+address1+" "+d1)
    return (d1 > d2);
}

使用另一个使用谷歌地图api计算两点之间距离的函数:

function getDistance(address1, address2) {
    var directionsService = new google.maps.DirectionsService;
    var request = getRequest(address1,address2);
    directionsService.route(request, function (response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            console.log(response.routes[0].legs[0].distance.value+ " the value");
            return (response.routes[0].legs[0].distance.value);
        }
        else {
            window.alert('Directions request failed due to ' + status);
            return 0;
        }
  });

这是来自浏览器的日志:

undefinedfun from closer
11 Franklin Ave, Franklin Square, NY 11010, USA 11 Franklin Ave, Franklin Square, NY 11010, USA undefined
11 Franklin Ave, Franklin Square, NY 11010, USA grand canyon    undefined
0 the value
3906002 the value

这表明虽然由于某种原因该值存在于getDistance函数中,但它并没有使它成为更接近的函数。有什么想法吗?

我注意到日志有点“乱序”,因为控制台登录getDistance应该真的在控制台登录之前,但是我不知道这是否意味着什么,更是如此要做的。

2 个答案:

答案 0 :(得分:0)

请告诉我这是否适合您:

function closer(address0, address1, address2, callback) {
    console.log(getDistance(address0, address2) + "fun from closer")
    var d1, d2;
    getDistance(address0, address2, function(d) {
        d1 = d;
        consolidate();
    });
    getDistance(address0, address1, function(d) {
        d2 = d;
        consolidate();
    });
    function consolidate() {
        if(d1 && d2) {
            callback(d1 > d2);
        }
    }
}

function getDistance(address1, address2, cb) {
    var directionsService = new google.maps.DirectionsService;
    var request = getRequest(address1, address2);
    directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            return (response.routes[0].legs[0].distance.value);
        } else {
            window.alert('Directions request failed due to ' + status);
            return 0; //may be you don't want to return 0 here since you are comparing distances.
        }
    });

//usage:

closer(address0, address1, address2, function(status) {
    console.log(status);
});

此解决方案不使用promises。凭借承诺,它将变得更加容易。

答案 1 :(得分:0)

承诺

//add <script> tag for a source downloaded from here https://github.com//kriskowal/q

function closer(address0, address1, address2) {
    var d = Q.defer();
    Q.allSettled([getDistance(address0, address1), getDistance(address0, address2)], function(results) {
        if(results[0].state === 'fulfilled' && results[1].state === 'fulfilled') {
            d.resolve(results[0].value > results[1].value);
        }
        else {
            d.reject();
        }
    });
    return d.promise;
}

function getDistance(address1, address2) {
    var d = Q.defer();
    var directionsService = new google.maps.DirectionsService;
    var request = getRequest(address1, address2);
    directionsService.route (request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            d.resolve(response.routes[0].legs[0].distance.value);
        } else {
            //may be you don't want to return 0 here since you are comparing distances.
            d.reject();
        }
    });
    return d.promise;
}
//usage

closer(address0, address1, address2).then(function(status) {
    //status == true is d1
    //status == false is d2
    console.log(status);
}, function(){
    console.log('Could not determined');
});