在DOM中加载脚本时的数组到.when()和回调

时间:2012-12-06 18:13:55

标签: jquery asynchronous callback loading asynccallback

我正在使用$.getScript进行异步调用,这将调用特定页面所需的脚本。我通过AJAX调用获取脚本以获取我需要的脚本,然后使用$.when函数按顺序加载它们,我不确定为什么.done()立即调用,而不是在脚本完全加载时并放置在DOM中,随时可以使用。

例如,AJAX调用返回:

['js/jquery.cookie.js', 'js/leaflet.js', 'js/index.js']

使用此代码:

var loadScripts = function(callback)
{
    $.getJSON('url.php', function(response)
    {
        $['when'].call(this, response).done(function()
        {
            callback();
        });
    });
};

通过以下方式致电:

loadScripts(function()
{
    // All scripts are loaded and ready to use
    // but the callback is fired immediately

    // L is undefined
    var map = L.map('map-view').setView([51.505, -0.09], 13);
});

我不想使用Head.js或Require.js这样的库,我需要一个简单的脚本,可以加载并等待加载的函数到位,可以使用。请注意,脚本列表也可以更改,顺序也是如此,因此$.when($.getScript(), $.getScript()).done()不会是我想要的。

我该如何处理?

1 个答案:

答案 0 :(得分:1)

你的ajax调用返回一个字符串数组,而不是延迟对象。您需要通过jQuery.getScript请求它们并存储返回值来实际生成这些字符串延迟对象。

var loadScripts = function(callback) {
    $.getJSON('url.php', function(response) {
        var defArr = $.map(response,function(url) {
            return $.getScript(url);
        });
        $.when.apply($, defArr).done(callback);
    });
};​