Javascript dojo.addOnLoad()从不在GWT页面中激发

Javascript dojo.addOnLoad()从不在GWT页面中激发,javascript,gwt,dojo,Javascript,Gwt,Dojo,我正在尝试在GWT项目中加载基本的ESRI ArcGIS地图。javascript ArcGIS API是用Dojo编写的,似乎要求您使用Dojo.addOnLoad()来确保初始化map对象的代码在ArcGIS API完全初始化之前不会运行。代码如下所示: var map; dojo.require("esri.Map"); function init() { map = new esri.Map("mapDiv"); v

我正在尝试在GWT项目中加载基本的ESRI ArcGIS地图。javascript ArcGIS API是用Dojo编写的,似乎要求您使用Dojo.addOnLoad()来确保初始化map对象的代码在ArcGIS API完全初始化之前不会运行。代码如下所示:

    var map;        
    dojo.require("esri.Map");
    function init() {
        map = new esri.Map("mapDiv");
        var basemapURL= "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer";
        var basemap = new esri.layers.ArcGISTiledMapServiceLayer(basemapURL);
        map.addLayer(basemap);
    }
    dojo.addOnLoad(init);
问题是,当我在GWT项目中使用此代码时,它从不调用我传递到dojo.addOnLoad中的函数。映射从未初始化,也从未显示。我已经用Firebug验证了addOnLoad()正在被调用,但init()没有被调用

我试着通过在计时器中从GWT代码调用init()来解决这个问题,这是可行的,但只有大约50%的时间。剩下的时间我会得到错误“TypeError:dojox.gfx.createSurface不是一个函数”,所以我很确定这样做时我正在创建一个竞争条件


在Eclipse中以开发人员模式运行项目或在Tomcat中托管编译后的项目没有任何区别。

在这种情况下,Dojo不是在寻找实际命名的函数
function init()
,而是一个包含函数
var init=function(){…}
的变量

您要做的是:

var map;        
dojo.require("esri.Map");
var init = function() {
  map = new esri.Map("mapDiv");
  var basemapURL= "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer";
  var basemap = new esri.layers.ArcGISTiledMapServiceLayer(basemapURL);
  map.addLayer(basemap);
}

dojo.addOnLoad(init);

您还可以使用gwt esri库: