js在定义对象后执行函数

时间:2013-08-14 18:37:03

标签: javascript jquery design-patterns require

我需要一个函数只有在定义一个对象后才可执行,我目前正在使用一个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 个答案:

答案 0 :(得分:0)

您可以使用回调参数:

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

....

samp: function(id, opt){
    setFullMap(id,function() {
        addNewLayer(opt);
    });
}

答案 1 :(得分:0)

您必须将callback function传递给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构造函数是同步的,那么它将不起作用。如果您无权访问构造函数和/或您无法将其传递给回调,那么可能只有({1}}或(更简单)setTimeout使用{(1}},持续检查如果操作已完成,则按定义的时间间隔,然后触发回调。

答案 2 :(得分: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/

答案 3 :(得分:0)

我检查了docs,似乎有各种各样的事件你可以听。

例如:

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事件也经过仔细陈述:

  

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