好的伙计们,我知道这个话题已经讨论过多次了,但我找不到解决问题的答案><。所以我试图做一个简单的思考:我正在创建一个字符串,例如:distance is : " + CalculateDistance(position);
想要的结果类似于 distance is 5kms (8min)
.
CalculateDistance(position)
是一个调用名为DistanceMatrix的Google maps API的函数,用于计算两点之间的距离。此处记录了 API,并且给定的示例完美运行。我改编成这样:
function CalculateDistance(position)
{
var service = new google.maps.DistanceMatrixService();
var destination = new google.maps.LatLng(/* some lat/lng */);
service.getDistanceMatrix(
{
origins: [position],
destinations: [destination],
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, callback);
}
function callback(response, status) {
if (status == google.maps.DistanceMatrixStatus.OK)
{
var origins = response.originAddresses;
var destinations = response.destinationAddresses;
var results = response.rows[0].elements;
distanceMatrixResult = results[0].distance.text + " ( " + results[0].duration.text + " min)";
}
哦,顺便说一下,distanceMatrixResult
是一个全局变量。实际上,我只需要获取结果[0].distance.text的内容(当我在控制台中以callback()
打印它时,该值为OK(,然后将该值与"距离是"连接起来。如果有人有更智能的解决方案,欢迎!
API 调用是异步的,就我而言,结果字符串中的distanceMatrixResult
始终为空。但是当我在控制台中记录它的值时,distanceMatrixResult
字符串创建后,该值变成了好值。
我想写的是:
• 调用CalculateDistance
(异步调用回调(
• callback
结束时,将字符串与 distanceMatrixResult
值连接起来。
我尝试了一些延期,比如$.done()
和$.when().then()
但我无法成功......
有人可以帮助我吗?
谢谢!
它
distanceMatrixResult
是一个全局变量
不应该,它应该是你的承诺(延期(所代表的价值。这是基本设置:
function calculateDistance(position) {
var service = new google.maps.DistanceMatrixService();
var destination = new google.maps.LatLng(/* some lat/lng */);
var dfd = $.Deferred();
service.getDistanceMatrix({
origins: [position],
destinations: [destination],
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC,
avoidHighways: false,
avoidTolls: false
}, function(response, status) {
if (status == google.maps.DistanceMatrixStatus.OK)
dfd.resolve(response);
else
dfd.reject(status);
});
return dfd.promise();
}
现在,你想做
calculateDistance(…).then(function(response) {
var origins = response.originAddresses;
var destinations = response.destinationAddresses;
var results = response.rows[0].elements;
return results[0].distance.text + " ( " + results[0].duration.text + " min)";
}).done(function(distanceMatrixResult) {
var myString = "distance is: "+distanceMatrixResult;
// do something with your string now
});