JavaScript函数不会将对象推送到全局数组变量

时间:2011-01-02 07:54:03

标签: javascript openlayers

EDITED :问题在于'find_callback'函数,我想将每个响应插入名为responseArray的全局数组中。响应是一个对象数组。

我正在尝试从一系列搜索中为OpenLayers的Waze实现添加标记。我想运行多个搜索,累积结果。我使用了3个函数,onInit()find_callback()addPoint()。调用'find_callback'函数会覆盖先前的标记。如果我进行一次搜索:

g_wzae_map.find('THE LOCATION', 'find_callback');

回复:

/* array of search results (up to 10) sorted by relevancy */
[ {
    //bounds that contain the this map feature (set map to this extent for closest zoom)
    "bounds":{"bottom":32.0880470275879,
    "left":34.7883338928223,
    "right":34.7912673950195,
    "top":32.0854721069336},
    //location of the feature
    "location":{"lat":32.08560397003471,"lon":34.78999763465419},
    //name of feature
    "name":"Street, City"
  },
  //up to 9 more results
  // ...
]

代码

function addPoint(response){
    var first_result = response;
    var lon = first_result.location.lon;
    var lat = first_result.location.lat;
    map.setCenter(new OpenLayers.LonLat(lon,lat));

    var markersPoint = new OpenLayers.Layer.Markers( "Markers" );
    markersPoint.addMarker(
        new OpenLayers.Marker(
            new OpenLayers.LonLat(
                lon,
                lat
                ),
            icon.clone()
            )
        );
    g_waze_map.map.addLayer(markersPoint);

    map.addPopup(
        new OpenLayers.Popup.FramedCloud(
            "point_"+first_result.location.lat,
            new OpenLayers.LonLat(lon,lat),
            null,
            "<div style='font-family:Arial,sans-serif;font-size:0.8em;'>"
            +first_result.name+"<div>",
            anchor=null,
            true,
            null
            )
        );

}


//called when map loads
function onInit(){
    map = g_waze_map.map;

    size    = new OpenLayers.Size(15, 20);
    offset  = new OpenLayers.Pixel(-(size.w/2), -size.h);
    icon    = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);         

    // array for the points
    responseArray = new Array();
    // find callback
   find_callback = function(response){
        for (var i=0, length = response.length; i<length; i++){
            responseArray.push(response[i]);
        }
        // alert(responseArray[0]); // working, getting an object
    }
    // alert(responseArray[0]); // not working, getting 'undefined'

    //search API example, calls 'find_callback' when search returns
    g_waze_map.find('Turin','find_callback');
    g_waze_map.find('Rome','find_callback', true);
    // adding the points
    for (var i=0, length = responseArray.length; i<length; i++){
        addPoint(responseArray[i]);
    }
};

谢谢!

1 个答案:

答案 0 :(得分:1)

g_waze_map.find()asynchronous,这就是它使用回调来处理结果的原因。当find返回时,搜索结果可能不可用。而不是从addPoint调用onInit,而是直接在find_callback

中调用它

find将搜索结果加载到另一个页面中,该页面可能会将结果存储为全局变量,以便在以后的调用重新加载页面时被破坏(请参阅为什么全局变量不好?)。如果是这种情况,您可以将除find的第一个电话之外的所有电话移至find回拨。

//called when map loads
function onInit(){
    var map = g_waze_map.map;

    var size    = new OpenLayers.Size(15, 20);
    var offset  = new OpenLayers.Pixel(-(size.w/2), -size.h);
    var icon    = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);         

    function addPoint(response){
        var first_result = response;
        var lon = response.location.lon;
        var lat = response.location.lat;
        //g_waze_map.map.setCenter(new OpenLayers.LonLat(lon,lat));

        var markersPoint = new OpenLayers.Layer.Markers( "Markers" );
        markersPoint.addMarker(
            new OpenLayers.Marker(
                new OpenLayers.LonLat(lon, lat),
                icon.clone()
        )   );
        g_waze_map.map.addLayer(markersPoint);

        g_waze_map.map.addPopup(
            new OpenLayers.Popup.FramedCloud(
                "point_"+lat, new OpenLayers.LonLat(lon,lat), null,
                "<div style='font-family:Arial,sans-serif;font-size:0.8em;'>"+response.name+"<div>",
                null, true, null
         )  );
    }

    // array for the points; this could be dropped
    var responseArray = [];
    function addPoints(response) {
        // if you want to save the responses for other purposes
        Array.push.apply(responseArray, response);
        for (var i=0, length = response.length; i<length; i++){
            addPoint(response[i]);
        }
    }

    var terms = ['Rome'];
    window.find_callback = function(response){
        addPoints(response);
        if (terms.length) {
            g_waze_map.find(terms.pop(),'find_callback', true);
        }
    }

    g_waze_map.find('Turin','find_callback');
};
相关问题