0

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

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

<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
      });
    }
  }
});

}

4

2 回答 2

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
于 2013-09-04T14:38:31.163 回答
0

…需要在foo.doFirst();…中创建的对象数组</p>

那么这可能是该doFirst方法应该返回的内容,而不是将其隐藏在对象上/foo对象中的某个位置。如果数组是异步创建的,您应该为它返回一个承诺(向我们展示您为 deferred 尝试的代码以获得帮助)。

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

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

于 2013-09-04T16:50:10.010 回答