1

我想使用 $.getScript 为 javascript 文件创建一个模块加载器,但是由于脚本的加载是异步的,因此当我将模块的函数调用放入文档中时,它们可能会在模块加载之前被调用。有什么方法可以避免这种情况,可能是通过暂停函数调用直到模块成功加载?

框架.core.js:

var Framework = $.extend(Framework, Framework.Core = { 
    modules: [ 
        'Module1', 
        'Module2'
    ], 
    init: function () { 
        $.each(modules, function (index, value) {  
            $.getScript('framework.' + value.toLowerCase() + '.js', function () { 
            }); 
        }); 
    }   

}); 
Framework.Core.init();

网站.html:

<html>
    <head>
        <script src="framework.core.js"></script>
        <script>Framework.Module1.functionCall();</script>  // Call a function independent of the completion of the framework.core.js loader
    </head>
... 
4

1 回答 1

0

您将需要打开依赖函数的成功回调以挂钩它。您将无法推迟执行以下函数以等待模块(除非您将通过 插入脚本document.write),因此回调是必要的。最好,只需将Deferred对象(由 ajax 函数返回)公开。此外,您根本不应该使用jQuery.getScript/该任务,因为它会阻止缓存。

var Framework = $.extend(Framework, Framework.Core = {
// The "Core" property seems pretty useless, by the way ^^
    modules: [ 
        'Module1', 
        'Module2'
    ],
    loads: {},
    init: function () { 
        $.each(this.modules, function(index, value) {  
            this.loads[value] = $.ajax({
                url: 'framework.' + value.toLowerCase() + '.js',
                cache:true,
                dataType:"script"
            }); 
        }); 
    }   

}); 
Framework.init();

<html>
    <head>
        <script src="framework.core.js"></script>
        <script>Framework.loads.Module1.then(function() {
            functionCall();
        }); // Call a function as soon as the module is loaded
        </script>
    </head>
... 
于 2012-08-06T21:42:41.607 回答