不能等待来自谷歌API的unitil结果

我有两个函数:getCoordinate()和getDistance(),都需要向google apis发出异步请求,结果是一个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指令在结果从谷歌返回之前执行。

  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’对象传递是有好处的。

此外,变量只有在范围内才可寻址,并且只能在异步回调中分配一次,因此您对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 

未经测试

当然,这不会直接开箱即用,因为你的代码的其余部分需要适应google.maps.LatLng对象,特别是我称之为myOrigin的变量(以前在一些外部范围内的latlng )和addressList那些。

在第一个函数成功时调用第二个函数

 var getCoordinate() { //call initial function $.ajax({ success: function(results) { getDistance(results);//call second function with the results of the first call } }); };