0

我需要一个函数只有在定义了一个对象之后才能执行,我目前正在使用 fascade 模式,一种方法依赖于另一种方法。在这种情况下,“addNewLayer”失败,因为“setFullMap”尚未完成执行。有解决办法吗?我正在使用 jquery 和 vanilla js,所以此时大多数解决方案都会有所帮助:

var jen = (function(){

  function setFullMap(mapID){
    jen.map = new Map(mapID);
  }

  function setLayer(opt){
   //execute code here after jen.map is defined
  }
 return{
   samp: function(id, opt){
     setFullMap(id);
     addNewLayer(opt);
   }
 };
})();

谢谢

解决方案:

var jen = (function(){
function setFullMap(mapID, callback) {
    jen.map = new Map(mapID);

    if(jen.map){
      callback();
    }
}

return {
  samp: function(id, opt){
    setFullMap(id, function(){
      addNewLayer(opt);
    }.bind(this));
  }
 };
})();
4

4 回答 4

0

我检查了文档,似乎您可以收听各种事件。

例如:

var m = new Map(...);

m.on('load', function () {
    //execute code when the first layer is ready
});

var l = new Layer(...);

l.on('load', function () {
    //execute code when the layer has been initialized
});

对于Layer.load事件也有仔细的说明:

在成功填充图层的图层属性后触发。此事件必须成功后才能将图层添加到地图中。

于 2013-08-14T19:03:45.420 回答
0

您必须传递一个callback functionto setFullMap,并在函数完成后执行它(最后,在关闭之前})。

var jen = (function(){

  function setFullMap(mapID, callback){
    jen.map = new Map(mapID);
    callback();
  }

  function setLayer(opt){
   //execute code here after jen.map is defined
  }
 return{
   samp: function(id, opt){
     setFullMap(id, function() {
       addNewLayer(opt);
     }.bind(this));
   }
 };
})();

不要忘记使用- 为了在你的回调函数.bind(this)中保留原件非常重要。this

编辑:

Map实际上,如果构造函数是异步的,那将不起作用。如果您无权访问构造函数和/或您无法将回调传递给它,那么可能唯一(也是可悲的)选项是使用 a setTimeoutor (easier) setInterval,如果操作已完成,则以定义的时间间隔连续检查,然后触发回调。

于 2013-08-14T18:42:48.287 回答
0

您可以使用回调参数:

function setFullmap(mapId,callback) {
    jen.map = new Map(mapId);
    callback();
}

....

samp: function(id, opt){
    setFullMap(id,function() {
        addNewLayer(opt);
    });
}
于 2013-08-14T18:38:35.783 回答
0

当您没有办法操作地图对象时,您需要使用循环:

var loop=self.setInterval(function(){
          if(jen.map) {
              //execute code here after jen.map is defined
              console.log(typeof jen.map);
              window.clearInterval(loop);
          }
      },50);

检查jsfiddle:http: //jsfiddle.net/9yv5t/1/

于 2013-08-14T19:00:12.857 回答