2015-05-09 58 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

相關問題