繁体   English   中英

从Javascript中的回调函数返回

[英]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”,而是收集整条路线的所有结果(由许多腿组成),然后立即进行处理。

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

  2. 我想到的另一个选择是从回调函数获得一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM