2015-05-09 59 views
0
gsvc.project(params, function (projectedPoints) { 
    pt = projectedPoints[0]; 
}); 

geometry.addPath(pt); 

谁能告诉我为什么projectedPoints只有在返回错误时才会返回?代码不会进入回调,并尝试将未定义的数组分配给数组。这会导致代码出错,这是回调最终启动的时间。为什么这个回调不会在JavaScript中返回一个值?

我一直试图引用here的代码,但似乎无法弄清楚如何让回调工作,就像在xample中一样。

` var map,gsvc,pt;

require([ 
    "esri/map", "esri/graphic", "esri/symbols/SimpleMarkerSymbol", 
    "esri/tasks/GeometryService", "esri/tasks/ProjectParameters", 
    "esri/SpatialReference", "esri/InfoTemplate", "dojo/dom", "dojo/on", 
    "dojo/domReady!" 
    ], function(
    Map, Graphic, SimpleMarkerSymbol, 
    GeometryService, ProjectParameters, 
    SpatialReference, InfoTemplate, dom, on 
) { 
    map = new Map("map", { 
     basemap: "streets", 
     center: [-98.445, 46.147], 
     zoom: 3 
    }); 

    gsvc = new GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer"); 
    map.on("click", projectToWebMercator); 

    function projectToWebMercator(evt) { 
     map.graphics.clear(); 

     var point = evt.mapPoint; 
     var symbol = new SimpleMarkerSymbol().setStyle("diamond"); 
     var graphic = new Graphic(point, symbol); 
     var outSR = new SpatialReference(102100); 

     map.graphics.add(graphic); 

     gsvc.project([ point ], outSR, function(projectedPoints) { 
     pt = projectedPoints[0]; 
     graphic.setInfoTemplate(new InfoTemplate("Coordinates", 
      "<span>X:</span>" + pt.x.toFixed() + "<br>" + 
      "<span>Y:</span>" + pt.y.toFixed() + "<br>" + 
      "<input type='button' value='Convert back to LatLong' id='convert'>" + 
      "<div id='latlong'></div>")); 
     map.infoWindow.setTitle(graphic.getTitle()); 
     map.infoWindow.setContent(graphic.getContent()); 
     map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint)); 
     on.once(dom.byId("convert"), "click", projectToLatLong); 
     }); 
    } 

    function projectToLatLong() { 
     var outSR = new SpatialReference(4326); 
     var params = new ProjectParameters(); 
     params.geometries = [pt.normalize()]; 
     params.outSR = outSR; 

     gsvc.project(params, function(projectedPoints) { 
     pt = projectedPoints[0]; 
     dom.byId("latlong").innerHTML = "<span>Latitude: </span> " + 
      pt.y.toFixed(3) + "<br><span>Longitude:</span>" + pt.x.toFixed(3); 
     }); 
    } 
    }); 
</script>` 

回答

0

您有一个可变范围问题。需要在回调之外定义pt

var pt; 

gsvc.project(params, function(projectedPoints) { 
    pt = projectedPoints[0]; 
}); 

geometry.addPath(pt); 

编辑:

如果.project()方法是异步的,那么阿伦的答案是正确的做法。

+0

试过已,功能仍然不会被跳过 – David

+0

然后,它的很可能是异步的。尝试移动像Arun建议的回调内的最后一行。 –

+0

我也试过。它仍然跳过,只是在代码 – David

0

这可能是因为项目是一个异步方法,如果这样

//looks like project is a async method 
gsvc.project(params, function (projectedPoints) { 
    var pt = projectedPoints[0]; 
    //do all operations which depends on pt in the callback 
    geometry.addPath(pt); 
}); 

//so this part will get executed before the callback is executed so pt won't be defined 
+0

在返回到回调之前,函数被跳过并进一步向下错误代码 – David

+0

@David这就是为什么所有依赖回调函数返回的值的代码都必须位于回调函数内部..如果您可以共享代码的更多细节我们可以看看 –

+0

我更新了原始帖子,以包含我正在尝试完成的一个示例@Arun – David

相关问题