Load ordering of dynamically added script tags

后端 未结 3 2033
慢半拍i
慢半拍i 2020-12-06 05:56

I have a typescript application that dynamically adds script tags that point to JS files. Due to some restrictions I cant have these script tags statically defined in a html

3条回答
  •  有刺的猬
    2020-12-06 06:41

    For anyone who is using jQuery I have improved @adeneo script so it will load all scripts in the specified order. It doesn't do chain loading, so it's very fast, but if you want even faster, change the 50 ms wait time.

    $.getMultiScripts = function(arr, path) {
    
        function executeInOrder(scr, code, resolve) {
            // if its the first script that should be executed
            if (scr == arr[0]) {
                arr.shift();
                eval(code);
                resolve();
                console.log('executed', scr);
            } else {
                // waiting
                setTimeout(function(){
                    executeInOrder(scr, code, resolve);
                }, 50);
            }
        }
    
        var _arr = $.map(arr, function(scr) {
    
            return new Promise((resolve) => {
                jQuery.ajax({
                    type: "GET",
                    url: (path || '') + scr,
                    dataType: "text",
                    success: function(code) {
                        console.log('loaded  ', scr);
                        executeInOrder(scr, code, resolve);
                    },
                    cache: true
                });
            });
    
        });
            
        _arr.push($.Deferred(function( deferred ){
            $( deferred.resolve );
        }));
            
        return $.when.apply($, _arr);
    }
    

    How to use:

    var script_arr = [
        'myscript1.js', 
        'myscript2.js', 
        'myscript3.js'
    ];
    
    $.getMultiScripts(script_arr, '/mypath/').done(function() {
        // all scripts loaded
    });
    

提交回复
热议问题