Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何等待动态加载的脚本在javascript中完全执行?_Javascript_Jquery_Ajax_Promise - Fatal编程技术网

如何等待动态加载的脚本在javascript中完全执行?

如何等待动态加载的脚本在javascript中完全执行?,javascript,jquery,ajax,promise,Javascript,Jquery,Ajax,Promise,在javascript中,我加载了几个脚本,然后想在之后运行一个函数。问题是,我的承诺太早了。它会在每个文件下载后运行,但我需要等待它们全部添加到DOM并完全执行 (function() { function getFile(path) { return $.get(path, function (data) { $("body").append(data); }); } $.when.apply($, [

在javascript中,我加载了几个脚本,然后想在之后运行一个函数。问题是,我的承诺太早了。它会在每个文件下载后运行,但我需要等待它们全部添加到DOM并完全执行

(function() {

    function getFile(path) {
        return $.get(path, function (data) {
            $("body").append(data);
        });
    }

    $.when.apply($, [
        // load all the individual components
        "components/once/ti-snackbar/ti-snackbar.html",
        "components/once/ti-not-supported/ti-not-supported.html",
        "components/once/ti-drawer/ti-drawer.html",
        "components/widgets/ti-company-table-row/ti-company-table-row.html",
        "components/widgets/ti-chip-set/ti-chip-set.html",
        "components/widgets/ti-list/ti-list.html",
        "components/widgets/ti-user-card/ti-user-card.html",
        "components/widgets/ti-tabs/ti-tabs.html",
        "components/widgets/ti-data-table/ti-data-table.html",
        "components/forms/ti-new-company-form/ti-new-company-form.html",
        "components/forms/ti-edit-company-form/ti-edit-company-form.html",
        "components/pages/ti-page-inquire/ti-page-inquire.html",
        "components/pages/ti-page-companies/ti-page-companies.html",
        "components/pages/ti-page-report/ti-page-report.html",
        "components/pages/ti-page-admins/ti-page-admins.html",
        "components/pages/ti-page-contacts/ti-page-contacts.html",
        "components/pages/ti-page-policy/ti-page-policy.html",
        "components/pages/ti-page-manual/ti-page-manual.html",
        "components/pages/ti-page-404/ti-page-404.html",
        "components/tabs/ti-tab-name/ti-tab-name.html",
        "components/tabs/ti-tab-tags/ti-tab-tags.html",
        "components/tabs/ti-tab-status/ti-tab-status.html",   
        "components/tabs/ti-tab-restriction/ti-tab-restriction.html",     
        "components/tabs/ti-tab-other/ti-tab-other.html"   
    ].map(getFile)).then(function() {
        // render the full app after all components load
        getFile("components/once/ti-app/ti-app.html");
    });
})();
我怎样才能修好它

注意:每个html文件都有一个

谢谢

这可能很有用:


我发现此代码可能存在以下几个问题:

  • 您没有强制您的
    $.get()
    调用按顺序完成,这样您就可以获得一个可变的完成顺序,并且可以按不同的顺序将内容附加到正文中(如果这很重要的话)

  • 您使用的是承诺和回调的混合,这会使事情难以准确排序。一般来说,不要把承诺和回扣混为一谈。如果您在一个地方有承诺,那么在任何地方都可以使用它们(必要时将回调转换为承诺)

  • 你说你“想在之后运行一个函数”,但你没有解释你想把这个函数放在哪里。要等待所有承诺,它必须位于
    .then()
    处理程序中

  • 下面是一个清理这些问题的实现:

    (function() {
    
        function getFile(path) {
            return $.get(path);
        }
    
        function append(data) {
            $("body").append(data);
        }
    
        var resources = [
            "components/once/ti-snackbar/ti-snackbar.html",
            "components/once/ti-not-supported/ti-not-supported.html",
            "components/once/ti-drawer/ti-drawer.html",
            "components/widgets/ti-company-table-row/ti-company-table-row.html",
            "components/widgets/ti-chip-set/ti-chip-set.html",
            "components/widgets/ti-list/ti-list.html",
            "components/widgets/ti-user-card/ti-user-card.html",
            "components/widgets/ti-tabs/ti-tabs.html",
            "components/widgets/ti-data-table/ti-data-table.html",
            "components/forms/ti-new-company-form/ti-new-company-form.html",
            "components/forms/ti-edit-company-form/ti-edit-company-form.html",
            "components/pages/ti-page-inquire/ti-page-inquire.html",
            "components/pages/ti-page-companies/ti-page-companies.html",
            "components/pages/ti-page-report/ti-page-report.html",
            "components/pages/ti-page-admins/ti-page-admins.html",
            "components/pages/ti-page-contacts/ti-page-contacts.html",
            "components/pages/ti-page-policy/ti-page-policy.html",
            "components/pages/ti-page-manual/ti-page-manual.html",
            "components/pages/ti-page-404/ti-page-404.html",
            "components/tabs/ti-tab-name/ti-tab-name.html",
            "components/tabs/ti-tab-tags/ti-tab-tags.html",
            "components/tabs/ti-tab-status/ti-tab-status.html",   
            "components/tabs/ti-tab-restriction/ti-tab-restriction.html",     
            "components/tabs/ti-tab-other/ti-tab-other.html"   
        ];
    
        return Promise.all(resources.map(getFile)).then(function(data) {
            // append all items to the body in order now that they are all retrieved
            data.forEach(append);
        }).then(function() {
            // now that everything else is in place, load and append 
            // the part that uses those scripts and templates
            return getFile("components/once/ti-app/ti-app.html").then(append);
        }).catch(function(err) {
            // handle error here
            console.log(err);
            throw err;    // propagate error
        });
    })().then(function() {
        // everything loaded here for code outside the IIFE here to know when it's all done
    }).catch(function(err) {
        // error occurred here for code outside the IIFE here to know there was an error
    });
    
    最后一个
    .then().catch()
    是可选的,如果您想让iLife之外的代码能够知道事情何时完成或发生错误

    修改和推理:

  • 首先加载所有资源,然后按照可预测的顺序追加,这允许您具有依赖关系或任何可以依赖于以前依赖关系的脚本初始化。以前,脚本的附加顺序不确定

  • ti-app.html
    在加载和附加所有其他脚本之前不会加载和附加

  • 将脚本数组的声明移到主代码流之外只是为了提高代码流的可读性

  • 增加了错误检测

  • 提供两个地方,你可以知道什么时候所有的事情都完成加载或者是否有错误,一个在IIFE内部,一个在IIFE外部(取决于你需要什么)

  • var l = new Loader();
    l.require([
    "example-script-1.js",
    "example-script-2.js"], 
    function() {
        // Callback
        console.log('All Scripts Loaded');
        // call your other script here
    });
    
    (function() {
    
        function getFile(path) {
            return $.get(path);
        }
    
        function append(data) {
            $("body").append(data);
        }
    
        var resources = [
            "components/once/ti-snackbar/ti-snackbar.html",
            "components/once/ti-not-supported/ti-not-supported.html",
            "components/once/ti-drawer/ti-drawer.html",
            "components/widgets/ti-company-table-row/ti-company-table-row.html",
            "components/widgets/ti-chip-set/ti-chip-set.html",
            "components/widgets/ti-list/ti-list.html",
            "components/widgets/ti-user-card/ti-user-card.html",
            "components/widgets/ti-tabs/ti-tabs.html",
            "components/widgets/ti-data-table/ti-data-table.html",
            "components/forms/ti-new-company-form/ti-new-company-form.html",
            "components/forms/ti-edit-company-form/ti-edit-company-form.html",
            "components/pages/ti-page-inquire/ti-page-inquire.html",
            "components/pages/ti-page-companies/ti-page-companies.html",
            "components/pages/ti-page-report/ti-page-report.html",
            "components/pages/ti-page-admins/ti-page-admins.html",
            "components/pages/ti-page-contacts/ti-page-contacts.html",
            "components/pages/ti-page-policy/ti-page-policy.html",
            "components/pages/ti-page-manual/ti-page-manual.html",
            "components/pages/ti-page-404/ti-page-404.html",
            "components/tabs/ti-tab-name/ti-tab-name.html",
            "components/tabs/ti-tab-tags/ti-tab-tags.html",
            "components/tabs/ti-tab-status/ti-tab-status.html",   
            "components/tabs/ti-tab-restriction/ti-tab-restriction.html",     
            "components/tabs/ti-tab-other/ti-tab-other.html"   
        ];
    
        return Promise.all(resources.map(getFile)).then(function(data) {
            // append all items to the body in order now that they are all retrieved
            data.forEach(append);
        }).then(function() {
            // now that everything else is in place, load and append 
            // the part that uses those scripts and templates
            return getFile("components/once/ti-app/ti-app.html").then(append);
        }).catch(function(err) {
            // handle error here
            console.log(err);
            throw err;    // propagate error
        });
    })().then(function() {
        // everything loaded here for code outside the IIFE here to know when it's all done
    }).catch(function(err) {
        // error occurred here for code outside the IIFE here to know there was an error
    });