等不及从Google API返回unitil结果 [英] Can't wait unitil results come back from google API

查看:77
本文介绍了等不及从Google API返回unitil结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个函数:getCoordinate()和getDistance(),都需要向google api发出异步请求,结果是一个json文件,

getDistance:

function getDistance(origin,destination,mode)
{
var url="http://maps.googleapis.com/maps/api/distancematrix/json?";

var origin="origins="+origin;
var destination="&destinations="+destination;
var mode="&mode="+mode;
var language="&language=fr-FR"
var sensor="&sensor=false";

var def = new jQuery.Deferred(); 
var city;
$.getJSON(url+origin+destination+mode+language+sensor,function(json)
{
    if (json.status=="OK")
    {
    var distance=json.rows[0].elements[0].distance.value;
    }
    def.resolve(distance);
});
return def.promise();
}

这是getCoordinates:

function getCoordinate(address)
{

var url="http://maps.googleapis.com/maps/api/geocode/json?address=";
var sensor="&sensor=false";
var def = new jQuery.Deferred(); 
var city;
$.getJSON(url+address+sensor,function(json)
{
    var lat=json.results[0].geometry.location.lat;
    var lng=json.results[0].geometry.location.lng;
    var dist=google.maps.geometry.spherical.computeDistanceBetween(myCenter,new google.maps.LatLng(lat,lng));
    console.log('address:'+dist/1000+'km');                                                    
    var coord=[lat,lng];
    def.resolve(coord);

});
return def.promise();
}

我需要在getDistance()中使用getCoordinate()方法的结果, 但是由于异步模式,getDistance指令会在结果从Google返回之前执行.

   for (i=0;i<addresses.length;i++)
{
$.when(getCoordinate(addresses[i])).then(function (coord) {
var myLatitude=coord[0];
var myLongitude=coord[1];
addressList[j++]=[coord[0],coord[1]];
    $.when(getDistance(lat+","+lng,myLatitude+","+myLongitude,"driving")).then(function(distance)
    {
    var test=i;
    var distTab=[];
    switch(i){
        case 0:
        //do Something
        break;

        default:
        //do something
        break;
          }
        }
    });

});
}       console.log("the dist:"+distance);
    console.log("coordinate:"+myLatitude+","+myLongitude);
    console.log("Center:"+lat+","+lng);

解决方案

由于您已经在使用"google.maps",因此将所有lat/lng值作为"google.maps.LatLng"对象传递是有好处的./p>

此外,变量仅在作用域内才可寻址,并且只能在异步回调中分配一次,因此您对console.log()的某些尝试必然会失败.

应用这些原理并整理(显着),我得到:

function getDistance(origin, destination, mode) {
    //Note: //origin, destination are now google.maps.LatLng objects
    var url = "http://maps.googleapis.com/maps/api/distancematrix/json";
    var data = {
        origin: origin.toUrlValue(),
        destination: destination.toUrlValue(),
        mode: mode,
        language: "fr-FR",
        sensor: "false"
    };
    return $.getJSON(url, data).then(function(json) {
        if(json.status=="OK") {
            return json.rows[0].elements[0].distance.value;
        }
        else return $.Deferred().reject().promise();
    });
}

function getCoordinate(address) {
    var url="http://maps.googleapis.com/maps/api/geocode/json";
    var data = {
        address: address,
        sensor: "false"
    };
    return $.getJSON(url, data).then(function(json) {
        if(json.results && json.results.length && json.results[0].geometry) {
            var latLng = new google.maps.LatLng(
                json.results[0].geometry.location.lat,
                json.results[0].geometry.location.lng
            );
            console.log("Center: " + latLng.toString());
            return latLng;
        }
    });
}

for (i=0; i<addresses.length; i++) {
    getCoordinate(addresses[i]).then(function(latLng) {
        console.log("coordinate: " + latLng.toString());
        addressList[j++] = latLng;//now a google.maps.LatLng object
        getDistance(myOrigin, latLng, "driving").then(function(distance) {
            console.log("the dist:" + distance);
            switch(i) {
                case 0: /* do Something */ break;
                default: /* do something */ break;
            }
        });
    });
}

未经测试的

当然,这将无法立即使用,因为您的其余代码将需要调整以与google.maps.LatLng对象一起使用,尤其是我称为myOrigin的变量(以前称为latlng(在某些外部范围内)和addressList中的那些.

I have Two functions : getCoordinate() and getDistance(), both need to make asynchronous request to google apis, the result is a json file,

getDistance:

function getDistance(origin,destination,mode)
{
var url="http://maps.googleapis.com/maps/api/distancematrix/json?";

var origin="origins="+origin;
var destination="&destinations="+destination;
var mode="&mode="+mode;
var language="&language=fr-FR"
var sensor="&sensor=false";

var def = new jQuery.Deferred(); 
var city;
$.getJSON(url+origin+destination+mode+language+sensor,function(json)
{
    if (json.status=="OK")
    {
    var distance=json.rows[0].elements[0].distance.value;
    }
    def.resolve(distance);
});
return def.promise();
}

And this is getCoordinates:

function getCoordinate(address)
{

var url="http://maps.googleapis.com/maps/api/geocode/json?address=";
var sensor="&sensor=false";
var def = new jQuery.Deferred(); 
var city;
$.getJSON(url+address+sensor,function(json)
{
    var lat=json.results[0].geometry.location.lat;
    var lng=json.results[0].geometry.location.lng;
    var dist=google.maps.geometry.spherical.computeDistanceBetween(myCenter,new google.maps.LatLng(lat,lng));
    console.log('address:'+dist/1000+'km');                                                    
    var coord=[lat,lng];
    def.resolve(coord);

});
return def.promise();
}

I need use the results of getCoordinate() method inside getDistance(), but due to the ansynchrous mode getDistance instructions are executed before the results come back from google.

   for (i=0;i<addresses.length;i++)
{
$.when(getCoordinate(addresses[i])).then(function (coord) {
var myLatitude=coord[0];
var myLongitude=coord[1];
addressList[j++]=[coord[0],coord[1]];
    $.when(getDistance(lat+","+lng,myLatitude+","+myLongitude,"driving")).then(function(distance)
    {
    var test=i;
    var distTab=[];
    switch(i){
        case 0:
        //do Something
        break;

        default:
        //do something
        break;
          }
        }
    });

});
}       console.log("the dist:"+distance);
    console.log("coordinate:"+myLatitude+","+myLongitude);
    console.log("Center:"+lat+","+lng);

解决方案

As you are already using 'google.maps', there are advantages in passing all lat/lng values around as 'google.maps.LatLng' objects.

Also, variables are addressable only when in scope and only once assigned in an async callback, so some of your attempts to console.log() are bound to fail.

Applying these principles and tidying up (significantly), I get :

function getDistance(origin, destination, mode) {
    //Note: //origin, destination are now google.maps.LatLng objects
    var url = "http://maps.googleapis.com/maps/api/distancematrix/json";
    var data = {
        origin: origin.toUrlValue(),
        destination: destination.toUrlValue(),
        mode: mode,
        language: "fr-FR",
        sensor: "false"
    };
    return $.getJSON(url, data).then(function(json) {
        if(json.status=="OK") {
            return json.rows[0].elements[0].distance.value;
        }
        else return $.Deferred().reject().promise();
    });
}

function getCoordinate(address) {
    var url="http://maps.googleapis.com/maps/api/geocode/json";
    var data = {
        address: address,
        sensor: "false"
    };
    return $.getJSON(url, data).then(function(json) {
        if(json.results && json.results.length && json.results[0].geometry) {
            var latLng = new google.maps.LatLng(
                json.results[0].geometry.location.lat,
                json.results[0].geometry.location.lng
            );
            console.log("Center: " + latLng.toString());
            return latLng;
        }
    });
}

for (i=0; i<addresses.length; i++) {
    getCoordinate(addresses[i]).then(function(latLng) {
        console.log("coordinate: " + latLng.toString());
        addressList[j++] = latLng;//now a google.maps.LatLng object
        getDistance(myOrigin, latLng, "driving").then(function(distance) {
            console.log("the dist:" + distance);
            switch(i) {
                case 0: /* do Something */ break;
                default: /* do something */ break;
            }
        });
    });
}

untested

Of course, this won't work straight out of the box because the rest of your code will need to be adapted to work with google.maps.LatLng objects, particularly the variable I have called myOrigin (previously lat and lng in some outer scope) and those in addressList.

这篇关于等不及从Google API返回unitil结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆