我是Javascript编码的新手,并且已经在很多地方寻找过这个信息,但是没有找到一个可行的解决方案,因此我在这里发布这个问题。
在for循环中,我试图使用 -
在区域(路线的一条腿)中请求POIservice.search(request, callback);
其中request包括查询的POI的位置和类型等参数。我已经实现了如下的回调函数 -
function callback(myResults, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
alert('myResults: ' + myResults.length);
// entire remaining code here, where I do some processing on the POIs.
}
}
此代码正常运行,在路线的每一段我都会看到POI,并且还会使用警报显示POI数量。
我的问题是我不想在这里为每条腿处理“myResult”,而是收集整条路线的所有结果(由许多腿组成),然后立即进行处理。
我首先考虑创建一个全局变量(“myPOIs”)并在每条腿上追加“myResults”,一旦整个路径被解析,然后处理这个myPOI,但我无法(或者我不能)知道如何将此myResults附加到全局变量myPOIs。
另一个选项,我想到的是从回调函数中获取一个返回(myResults),然后收集(追加)所有结果。
1和2之间的唯一区别在于,在1中,它是一个全局变量,我将myResults附加到if条件中,而在2中,如果if条件为true,则将myResults返回到service.search然后在那里收集结果。
我尝试使用myPOIs.push(myResults)和其他一些选项,但是当我检查myPOIs.length时,它总是为空。我真的不知道如何让myResults退出回调函数。
任何建议/通过/帮助对我都非常有用。
我想只使用javascript,而不是其他。
提前多多感谢, AXS
答案 0 :(得分:2)
假设你正在调用这样的搜索:
for (var i = 0; i < legs.length; i++) {
service.search(legs[i], callback);
}
然后你可以通过跟踪所有结果和你被回电的次数来做到这一点:
var callbacksOutstanding = legs.length;
var allPlaces = [];
var callback = function(legPlaces, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
allPlaces.push.apply(allPlaces, legPlaces);
}
if (--callbacksOustanding === 0) {
processPlaces(allPlaces);
}
};
for (var i = 0; i < legs.length; i++) {
service.search(legs[i], callback);
}
processPlaces
是您编写的一些函数,用于处理完整的PlaceResult
个对象。
现在三个var
语句中有不是全局变量,如果它全部包含在一个函数中(应该是这样),因为在Javascript中你可以而且应该在其他函数中定义函数功能。如果这样做,内部函数将可以访问外部函数中的变量。所以对我来说,这可能是这样的:
function findAndProcessPlaces(legs) {
var callbacksOutstanding = legs.length;
var allPlaces = [];
var callback = function(legPlaces, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
allPlaces.push.apply(allPlaces, legPlaces);
}
if (--callbacksOustanding === 0) {
processPlaces(allPlaces);
}
};
for (var i = 0; i < legs.length; i++) {
service.search(legs[i], callback);
}
}
注意:allPlaces.push.apply
行执行一个阵列到另一个阵列的就地连接。你也可以写:
allPlaces = allPlaces.concat(legPlaces)
此时。
答案 1 :(得分:0)
创建一个全局变量:
var POIResults = [];
在你的函数回调中
POIResults.push(myResults);
稍后在方便的时候,调用一个迭代数组的函数
function checkResults(){
for(var i = 0; i < POIResults.length; i++){
//TODO: check POIResults[i]
}
}
答案 2 :(得分:0)
在回调之外和右边范围内定义的数组应该可以解决问题。你能用全局数组方法发布代码吗?