2

我正在使用管理器nokia.places.search.manager (HERE API)的reverseGeo方法来检索有关坐标的信息。在显示某一点的信息时,它在我的情况下工作正常。但是当我得到一个以上的点时,我的所有点都会得到最后一个的信息。

事实上,我不使用 infobubble 在onComplete方法中显示地址信息,就像在提供的示例中所做的那样。

我已将所有标记(嵌入 InfoBuble 的 nokia.maps.map.Marker 的扩展)存储在键/值全局变量中。所以在onComplete方法中,我想更新正确的标记。

下面是我调用搜索服务的方式:

searchManager.reverseGeoCode({
latitude: lat,
longitude: lng,
onComplete: function(data, status, requestId){
    processResults(data, status, requestId, myID);
    }
});

其中myID是允许检索正确标记以使用地址信息进行更新的值。

问候

4

2 回答 2

1

我今天也有类似的,而且很模糊。与 Andrzej Duś 建议的思路相同,回调函数的范围存在问题。回调中的参数在回调执行时进行评估,这就是为什么它总是使用传递给最后一个参数的参数执行。您需要使用封闭循环中特定迭代的参数(即 myID)执行回调函数。

一种方法是创建一个新函数,如下所示:

var f = new Function('myCallbackFunction(' + myID + ')');
exampleExternalFunction(f);

或者,使用您的示例,

var f= new Function('data', 'status', 'requestId',
    'processResults(data, status, requestId,' + myID + ')'

... other code ...
onComplete: f
...

我可能不适合您的情况。查看 JavaScript “new Function()” 的详细信息以更好地理解这一点。

于 2015-02-19T02:39:41.987 回答
1

您可以使用立即调用的函数表达式对任何 JavaScript 回调执行此操作。

您的代码应如下所示:

searchManager.reverseGeoCode({
    latitude: lat,
    longitude: lng,
    onComplete: (function(localID) {
        return function(data, status, requestId) {
            processResults(data, status, requestId, localID);
        };
    })(myID)
});

要理解这个例子,你需要很好地理解闭包和上面提到的立即调用函数表达式的语法。

于 2013-08-12T15:58:41.693 回答