[英]Return from a callback function in Javascript
我是Javascript编码的新手,并且已经在很多地方寻找这些信息,但是没有找到一个有用的解决方案,因此我在这里发布这个问题。
在for循环中,我试图在一个区域(路线的一条腿)中使用以下方式请求POI:
service.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,并且还会使用alert显示POI的数量。
我的问题是我不想在这里为每条腿处理“myResult”,而是收集整条路线的所有结果(由许多腿组成),然后立即进行处理。
我首先考虑创建一个全局变量(“myPOIs”)并在每条腿上追加“myResults”,一旦整个路径被解析,然后处理这个myPOI,但我无法(或者我不知道如何)追加这个myResults到一个全局变量myPOIs。
我想到的另一个选择是从回调函数获得一个return(myResults),然后收集(追加)所有结果。
1和2之间的唯一区别在于,在1中,它是一个全局变量,我将myResults附加到if条件中,在2中,如果if条件为true,则将myResults返回到service.search然后收集那里的结果。
我尝试使用myPOIs.push(myResults)和其他一些选项,但是当我检查myPOIs.length时,它总是为空。 我真的不知道如何让myResults退出回调函数。
任何建议/通过/帮助对我都非常有用。
我想只使用javascript,而不是其他。
非常感谢,斧头
假设你正在调用这样的搜索:
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)
这一点。
创建一个全局变量:
var POIResults = [];
在你的函数回调中
POIResults.push(myResults);
稍后在方便的时候,调用一个迭代数组的函数
function checkResults(){
for(var i = 0; i < POIResults.length; i++){
//TODO: check POIResults[i]
}
}
在回调范围内定义的一个数组应该可以解决问题。 你能用全局数组方法发布代码吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.