0

我是 Javascript 编码的新手,已经在很多地方寻找过这些信息,但还没有找到一个可行的解决方案,因此我在这里发布了这个问题。

在 for 循环中,我尝试使用 -

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. 我首先想到创建一个全局变量(“myPOI”)并在每条腿上附加“myResults”,一旦解析了整个路线,然后处理这个 myPOI,但我不能(或者我不知道如何)附加这个myResults 到全局变量 myPOI。

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

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

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

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

我只想使用 javascript 而不是别的。

非常感谢,斧头

4

3 回答 3

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)

在此刻。

于 2012-07-01T22:56:03.497 回答
0

创建一个全局变量:

var POIResults = [];

在您的函数回调中

POIResults.push(myResults);

稍后在您方便的时候,调用一个迭代数组的函数

function checkResults(){
 for(var i = 0; i < POIResults.length; i++){
  //TODO: check POIResults[i]
 }
} 
于 2012-07-01T21:43:48.267 回答
0

在回调之外并在正确范围内定义的数组应该可以解决问题。您可以使用全局数组方法发布代码吗?

于 2012-07-01T21:48:02.487 回答