如何确保在具有匿名函数的循环中使用'正确'变量?

时间:2011-03-16 21:34:05

标签: javascript closures anonymous-function

我们已按照Tom Anthony's tutorial计算英国邮政编码的地理编码,以在Google地图上绘制标记。这工作正常,但现在我们希望在您单击某个位置时添加弹出窗口。所以我们更新了我们的函数来放置一个标记和原始usePointFromPostcode代码来描述:

function usePointFromPostcode(postcode, description, callbackFunction) {

  localSearch.setSearchCompleteCallback(null, 
    function() {

      if (localSearch.results[0]) {    
        var resultLat = localSearch.results[0].lat;
        var resultLng = localSearch.results[0].lng;
        var point = new GLatLng(resultLat,resultLng);
        callbackFunction(point, description);
      }else{
        alert("Postcode not found!");
      }
    });  

  localSearch.execute(postcode + ", UK");
}
// loop through the array of postcodes to output markers
for(var i=0; i<postcodes; i++) {
    usePointFromPostcode(postcodes[i], descriptions[i], placeMarkerAtPoint);
}

然而,当页面加载时没有错误,标记都具有相同的描述 - 数组中最后一项的描述。我认为这是由于关闭,或者说缺少关闭,但我无法解决问题。我们如何让这些描述与点同步?

1 个答案:

答案 0 :(得分:0)

如果localsearch.execute启动搜索但在搜索完成之前返回,那么这将解释该行为。两种可能的方案。为每个查询创建单独的GlocalSearch对象或发出第二个查询的延迟,直到第一个查询完成,等等。

我不太清楚GlocalSearch课程是否说明前者是否明智。如果是,你可能会有几个并行运行的搜索,可以按任意顺序完成。

要执行稍后操作:更改回调以将全局标记 done 设置为true。在开始第一次搜索之前,将 done 设置为false。启动第一次搜索后,设置超时。超时执行的代码执行以下操作:如果 done 现在为true,则将 done 设置为false并启动第二次搜索。否则,它只是重复相同的超时。当然,在所有搜索完成之前,这种事情会重复,此时超时代码会在该循环之后启动您想要执行的任何操作。有关可能有用的简短文章,请参阅http://www.ehow.com/how_4847411_simulate-whilesleep-loop-javascript.html