从Javascript中的回调函数返回

时间:2012-07-01 21:40:39

标签: javascript google-maps-api-3

我是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,并且还会使用警报显示POI数量。

我的问题是我不想在这里为每条腿处理“myResult”,而是收集整条路线的所有结果(由许多腿组成),然后立即进行处理。

  1. 我首先考虑创建一个全局变量(“myPOIs”)并在每条腿上追加“myResults”,一旦整个路径被解析,然后处理这个myPOI,但我无法(或者我不能)知道如何将此myResults附加到全局变量myPOIs。

  2. 另一个选项,我想到的是从回调函数中获取一个返回(myResults),然后收集(追加)所有结果。

  3. 1和2之间的唯一区别在于,在1中,它是一个全局变量,我将myResults附加到if条件中,而在2中,如果if条件为true,则将myResults返回到service.search然后在那里收集结果。

    我尝试使用myPOIs.push(myResults)和其他一些选项,但是当我检查myPOIs.length时,它总是为空。我真的不知道如何让myResults退出回调函数。

    任何建议/通过/帮助对我都非常有用。

    我想只使用javascript,而不是其他。

    提前多多感谢, AXS

3 个答案:

答案 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)

在回调之外和右边范围内定义的数组应该可以解决问题。你能用全局数组方法发布代码吗?