javascript - 从 Javascript 中的回调函数返回

标签 javascript google-maps-api-3

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

在 for 循环中,我尝试使用 - 请求某个区域(路线的一段)中的 POI -

service.search(request, callback);

其中请求包含查询的 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”,解析整个路线后,然后处理这个 myPOIs,但我不能(或者我不知道)知道如何)将此 myResults 附加到全局变量 myPOIs。

  2. 我想到的另一个选择是从回调函数中获取返回值(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)

此时。

关于javascript - 从 Javascript 中的回调函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11285834/

相关文章:

php - 如何减少 HTTP 请求?

javascript - 如何使用jquery格式化子输入的电话号码?

javascript - GetDistance Javascript 在有一些参数值时不返回任何内容

javascript - javascript 中 `Response.Redirect("~/abc.aspx") 的等效代码是什么?

google-maps - 实例化时,Google Map 元素是否必须在 DOM 中?

php - 获取附近位置的最佳方式?

google-maps-api-3 - 如何获取 Google Map Api v3 key ?

javascript - 如何在 NodeJs 中使用异步数据源创建可读流?

python - 如何修复 "googlemaps.exceptions.ApiError : REQUEST_DENIED"

javascript - 使用 MarkerClustererPlus 和 OverlappingMarkerSpiderfier 重叠指针