Javascript 对象实例化后JS使函数可用
我正在使用构建一个JS框架,我遇到了一个范围问题。在html端,当我执行多个方法时。第二种方法失败,因为第一种方法尚未完成。我尝试了jquery,但运气不佳,我想我可能必须修改JS的模式才能实现这一点,但是在对象实例化之后,是否可以使函数可用? 我的猜测是将模式更改为模块,但我不确定,在进入第一百万个兔子洞之前,问一下似乎是明智的。。。。 谢谢Javascript 对象实例化后JS使函数可用,javascript,jquery,design-patterns,Javascript,Jquery,Design Patterns,我正在使用构建一个JS框架,我遇到了一个范围问题。在html端,当我执行多个方法时。第二种方法失败,因为第一种方法尚未完成。我尝试了jquery,但运气不佳,我想我可能必须修改JS的模式才能实现这一点,但是在对象实例化之后,是否可以使函数可用? 我的猜测是将模式更改为模块,但我不确定,在进入第一百万个兔子洞之前,问一下似乎是明智的。。。。 谢谢 foo.doFirst(“#id”); foo.availableSecond(‘万岁’); 编辑: foo.doFirst()这将调用一系列嵌套在
foo.doFirst(“#id”);
foo.availableSecond(‘万岁’);
编辑:
foo.doFirst()这将调用一系列嵌套在“foo”中的函数。最重要的是,对象是在内部创建的。特别是食物层;这是一个对象数组
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
});
}
}
});
功能添加层(opt){
$.when(jen.infLayers).done(函数(){
对于(变量i=0;i
}您可以通过多种方式实现这一点。推迟当然会有帮助。分离功能是另一种方法,但这里有一个延迟解决方案:
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
…需要在foo.doFirst()中创建的对象数组代码>
那么这可能就是doFirst
方法应该返回的内容,而不是将其隐藏在foo
对象的某个位置。如果数组是异步创建的,您应该返回一个承诺(向我们展示您为延迟者获取帮助而尝试的代码)
在对象实例化后,是否可以使函数可用
当然,只需将该函数设置为实例化对象的方法。通常,通过将该函数设置为所述对象的方法即可。你似乎在做什么。恐怕我们没有足够的代码来理解这个问题。这完全取决于doFirst
实际做了什么。为什么不直接调用availableSecond
作为回调?@JeffShaver如果可以使用deferred
,为什么要使用回调?感谢addLayer
代码。但是,doFirst
是如何调用的,什么是jen.inflayers
和setLayer
?只有在doFirst()
之前调用availableSecond()
时才“起作用”。不,它在两种顺序下都起作用,这就是延迟的工作方式<代码>第二个
永远不会在第一个之前出现。它不起作用。这就是问题所在。除非您先调用availableSecond
,否则它不会第二次打印出来。我复制并粘贴了你的代码,所以我没有打字错误。@JeffShaver:两个命令都有。请注意,单个延迟只能解决一次,您可能犯了将两个调用复制到同一小提琴中的错误。
foo.doFirst(); /// prints first
foo.availableSecond(); // prints second