2011-03-17 42 views
1

作为一个我一直在研究的项目已经发展壮大,因此当其他代码尝试访问它们时,页面上的所有脚本都不可用。尽管在更新代码(例如,不缓存)后,这种情况经常发生,但我从未尝试过的时候会越来越多地出现在测试中。确保脚本可用性的模式或技巧?

我已经解决了这个问题,部分是通过使用函数来等待模块可用(请参阅this question),这主要解决了这个问题,但我并不完全对实现感到兴奋,并且期待为更多的工业强度模式来解决这个问题。以下是可能的解决方案,我想出来的:

1)加载脚本上的东西,如ensure需求 - 不理想。需要在每个脚本中包含实际的脚本名称相关性信息,而不仅仅是模块/对象名称。在使用资源确保其可用之前,仍然需要采取一些措施。

2)管理脚本加载顺序。如果这样做甚至会起作用(例如,我不认为在脚本B之前简单地放置脚本A以确保它将可用,因为它们可以同时加载),这将是一种痛苦,因为直到你“已经加载了依赖于它的东西。在一个拥有大量使用不同资源的页面的网站上进行设置需要很多工作(并且我无意在每个页面上加载站点上到处都使用的所有内容)。

3)等待一切在允许用户交互之前加载到给定页面上。出于显而易见的原因,这远非理想。仍然没有解决在初始化代码中发生的依赖关系。

4)展开我当前的解决方案。目前工作方式类似(这是伪代码,但基本的逻辑过程):

// Depends on Module2 
Module1 = (function() { 
    self = {}; 
    // function requires dependency 
    // waitFor waits until global named 'dependency' is available then calls callback 
    self.initialized=false; 
    self.init = function() { 
     waitFor('Module2', function() { 
      self.intialized=true; 
     }); 
    } 
    // waitForInitialization sets a callback when self.initialized=true 
    self.func = self.waitForInitialization(func() { 
      Module2.doStuff(); 
     }); 
    } 
    //UI-initiated function requires dependency 
    self.uiFunc = function() { 
     if (!self.initialized) { 
      showPleaseWaitDialog(); 
      self.waitForInitialization(function() { 
       dismissPleaseWaitDialog(); 
       self.uiFuncImpl); 
     } else { 
      self.uiFuncImpl(); 
     } 
    } 
    self.uiFuncImpl= function() { 
     Module2.doStuff(); 
    } 
}()); 

我能想到的方法来创建一个原型,将更加透明地处理的依赖问题比我上面的代码,并且完全打算如果必须这样做,但这真的是最好的解决方案吗?别人做什么?什么被认为是最佳实践?

+0

渐进式增强和在document.ready上调用您的javascript函数/对象有什么问题? – Raynos 2011-03-17 17:18:35

+0

document.ready不能保证包含被加载,只是DOM。 – 2011-03-17 17:19:09

+0

@Jamietre你会发现jQuery document.ready可以加载javascript包含的头文件。 – Raynos 2011-03-17 17:21:33

回答

0

2)脚本加载顺序 - 脚本会一直在它们被放置在DOM中的顺序来执行,因此,尽管他们可能会同时加载他们将在一种有序的方式(在一个大的项目,我的工作就面临着同样的问题执行)。

?)如果脚本加载顺序不适合您,您可以查看Promise模型。如果承诺和加载顺序不适合你,你可以听一个命名空间的事件,每个模块在初始化时可以触发,这样,如果对象存在,它可以被使用,如果不是它的初始化可以听。

+0

重要的是知道加载顺序。这很困难,因为我必须将依赖性信息添加到我正在使用的资源管理进程中并处理它。事情现在往往是完全倒退的(因为模块是由需要依赖的模块添加的)。但是,因为它实际上会起作用 - 这可能是最好的解决方案。我现在基本上使用承诺(除了特别要求加载资源,我等待它出现)。没有考虑过事件模型,听起来比我目前的方式更有趣,更好。 – 2011-03-17 17:51:50

+0

我注意到,在发布Promise之后,他们似乎很快就流行起来。事件模型在我看来并不理想,但它是有效的,并且可以让你的模块不知道它不需要知道的事情。所有的每个对象必须知道它的依赖是什么。 – 2011-03-17 17:57:17

+0

它的工作原理,我只是不满意,不得不让每一个方法在有依赖的时候做别的事情。正如我在最初的问题结尾提到的那样,我认为我可以开发一些东西来封装它,但听起来像是工作。对于我的情况,如果能够真正解决问题,那么让代码从底部开始排列脚本可能会更容易。 – 2011-03-17 18:00:02