0

我正在处理异步调用$.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()不是我想要的。

我该如何处理?

4

1 回答 1

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);
    });
};​
于 2012-12-06T18:43:36.780 回答