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

时间:2013-09-04 14:33:06

标签: javascript jquery design-patterns

我正在使用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
      });
    }
  }
});

}

2 个答案:

答案 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试过的代码,以获得它的帮助)。

  

是否可以在实例化对象后使函数可用?

当然,只需将该函数作为实例化对象的方法。