我正在尝试使用google maps API并遇到一些麻烦。我创建了一个名为getPoint的函数,它接受一个地址。它使用google api将该地址转换为GPoint对象,使用GClientGeocoder.getLatLng(地址,回调)函数。 getLatLng()传递地址和回调函数,如下所示。我希望我编写的getPoint()函数返回从getLatLng()调用传递给回调函数的“point”变量。我正在努力弄清楚如何做到这一点,甚至可以做到这一点?
function getPoint(address) {
var geocoder = new GClientGeocoder();
return geocoder.getLatLng(
address,
function(point){
return point;
}
);
}
提前感谢您的帮助!
答案 0 :(得分:6)
GClientGeocoder.getLatLng
是一个异步操作,因此return
中的getPoint
语句实际上没有达到预期效果。
您必须重新构建代码以获取回调函数,在异步操作完成时调用该函数:
function getPoint(address, callback) {
var geocoder = new GClientGeocoder();
geocoder.getLatLng(
address,
function(point){
/* asynch operation complete.
* Call the callback with the results */
callback(point)
}
);
}
甚至更好(虽然触摸更深奥):
function getPoint(address, callback) {
var geocoder = new GClientGeocoder();
geocoder.getLatLng(
address,
callback // GClientGeocoder will call the callback for you
);
}
修改重新发表您的评论问题:
好的,这是另一个问题,但简而言之,只要您在定义地图实例的同一范围内定义函数,您传递的JavaScript函数回调就可以访问您的地图实例:
var map = new GMap2(/*...*/);
var addresses = []; // list of address strings
for(var i=0; i < addresses.length; i++) {
getPoint(addresses[i], function(point) { // pass the callback function
map.addOverlay(/*...*/); // map variable is in scope
})
}
这种函数称为闭包。
答案 1 :(得分:2)
不,它无法完成。相反,你必须设置一个方法,一旦它到达未来的某个点就知道如何处理答案 - 这就是回调的本质。
所以,目前,您的设计如下:
var myPoint = getPoint(theAddress);
doSomethingWithPoint(myPoint);
doSomethingElseWithPoint(myPoint);
但现在看起来应该是
function getPoint(address, callback) {
var geocoder = new GClientGeocoder();
geocoder.getLatLng(address, callback);
}
getPoint(theAddress, function(myPoint) {
doSomethingWithPoint(myPoint);
doSomethingElseWithPoint(myPoint);
});
答案 2 :(得分:0)
你不能这样做。 getLatLng()
是一个异步函数:它会在收到响应后发送HTTP请求并调用回调。同时,您的本地脚本将继续执行,并且在调用回调之前将返回getLatLng()
。