我正在使用facade pattern构建一个JS框架,我遇到了一个范围问题。在html方面,当我执行多个方法时。第二种方法失败,因为第一种方法尚未完成。我试过jquery推迟到没有运气,我想我可能必须修改JS的模式来实现这一点,但是有可能在实例化一个对象后使一个函数可用吗?
我的猜测是将模式改为模块,但我不确定,在走下百万洞兔洞之前,问起来是明智的.... 感谢
<script type="text/javascript" src="">
foo.doFirst('#id');
foo.availableSecond('#hooray');
</script>
修改
foo.doFirst(); 这会调用一系列嵌套在'foo'中的函数。最重要的是,对象是在里面创建的。特别是foo.Layers;这是一个对象数组
foo.doSecond(); 这需要在 foo.doFirst(); 中创建的对象数组来解析并执行另一个函数。
要注意。如果我单独执行第一个方法,应用程序加载,在页面加载后我可以调用第二个方法并且它干净地执行。这是让我觉得我需要强制第二种方法等到第一种方法完成的原因。
第二次编辑:** 以下是我的延期尝试。 **目标:在执行
之前定义'jen.infLayers'第三次修改: foo.doFirst()= jen.doFirst();实例化jen对象,并在将实例化对象推入其中后将jen.infLayers实例化为数组。所有这些都需要在jen.doSecond()调用之前的函数之前发生,如果标题匹配,它将循环并加载应用程序的新对象。
function addLayer(opt) {
$.when(jen.infLayers).done(function() {
for (var i = 0; i < jen.infLayers.length; i++) {
if (jen.infLayers[i].title === opt) {
setLayer({
url: jen.infLayers[i].url,
title: jen.infLayers[i].title,
visible: jen.infLayers[i].visible,
img: jen.infLayers[i].img,
lyrType: jen.infLayers[i].lyrType
});
}
}
});
}
答案 0 :(得分:0)
你可以通过多种方式做到这一点。推迟肯定可以帮助。解耦您的功能是另一种方式,但这是一个延迟解决方案:
foo = (function () {
var first_deferred = $.Deferred();
return {
doFirst: function () {
console.log("first");
first_deferred.resolve();
},
availableSecond: function () {
first_deferred.done(function () {
console.log("second");
});
}
};
}());
现在,如果你打电话:
foo.availableSecond(); // prints nothing
foo.doFirst(); /// prints first second
其他顺序:
foo.doFirst(); /// prints first
foo.availableSecond(); // prints second
答案 1 :(得分:0)
...需要在
中创建的对象数组foo.doFirst();
...
然后,这可能是doFirst
方法应该返回的内容,而不是将其隐藏在foo
对象上/内的某个位置。如果数组是异步创建的,那么你应该为它返回一个promise(向我们展示你为deferreds试过的代码,以获得它的帮助)。
是否可以在实例化对象后使函数可用?
当然,只需将该函数作为实例化对象的方法。