我需要一个函数只有在定义一个对象后才可执行,我目前正在使用一个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));
}
};
})();
答案 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事件也经过仔细陈述:
成功填充图层的图层属性后触发。 在将图层添加到图层之前,此事件必须成功 地图。