Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象实例化后JS使函数可用_Javascript_Jquery_Design Patterns - Fatal编程技术网

Javascript 对象实例化后JS使函数可用

Javascript 对象实例化后JS使函数可用,javascript,jquery,design-patterns,Javascript,Jquery,Design Patterns,我正在使用构建一个JS框架,我遇到了一个范围问题。在html端,当我执行多个方法时。第二种方法失败,因为第一种方法尚未完成。我尝试了jquery,但运气不佳,我想我可能必须修改JS的模式才能实现这一点,但是在对象实例化之后,是否可以使函数可用? 我的猜测是将模式更改为模块,但我不确定,在进入第一百万个兔子洞之前,问一下似乎是明智的。。。。 谢谢 foo.doFirst(“#id”); foo.availableSecond(‘万岁’); 编辑: foo.doFirst()这将调用一系列嵌套在

我正在使用构建一个JS框架,我遇到了一个范围问题。在html端,当我执行多个方法时。第二种方法失败,因为第一种方法尚未完成。我尝试了jquery,但运气不佳,我想我可能必须修改JS的模式才能实现这一点,但是在对象实例化之后,是否可以使函数可用?

我的猜测是将模式更改为模块,但我不确定,在进入第一百万个兔子洞之前,问一下似乎是明智的。。。。 谢谢


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