RequireJS定义浏览器竞争条件

时间:2012-03-21 19:41:47

标签: javascript frameworks require race-condition

我们有一个客户端插件框架,它由模块(AMD)构成,并使用require.js。在此框架中,我们公开了一个由配置属性和通用框架功能组成的公共对象。公共对象的所有必需功能都包含在一个文件中(尽管分成了模块);最终用户添加到其页面所需的唯一文件。 我们看到的问题在Safari中最为普遍,但偶尔也会出现在IE和Chrome中。在具有空缓存的Safari中100%的时间我们遇到竞争条件。请考虑此示例客户端代码,该代码位于客户端页面的主体中。

<script type=”text/javascript”>
    Me.subscribe(‘someEvent’, someHandler);
</script>

' Me '始终可用作页面的全局和任何定义调用之外。但是,“ Me.subscribe ”包含在“ define ”中,并使用上述条件生成“ undefined ”。 我们无法告诉客户使用任何第三方框架来解决此问题。上面的代码块必须保持原样。 我一直在想要允许延迟某些公共功能绑定而不需要客户端进行任何额外的工作。到目前为止,这是我正在考虑添加到框架中的内容:

Me.deferred = function (fn, name) {
            if (fn) return fn;
            fn = this;
            return function () {
                var args = Array.prototype.slice.call(arguments);
                setTimeout(function () {
                    fn[name].apply(this, args);
                }, 0);
            };
        };

然后,在靠近顶部的框架中,我可以添加我想要延迟的项目:

Me.subscribe = Me.deferred(Me.subscribe,'subscribe');

我的问题是:我错过了那些已经存在的东西吗?是否存在我不知道处理这种确切情况的现有模式?这一般只是一个坏主意吗?

1 个答案:

答案 0 :(得分:0)

如果可能,请确保客户端将requireJS和所有依赖项放在head中。 “”可以包含on-demand调用,如果无法执行,则会在创建时执行。