如何使JavaScript代码执行等到加载并执行带脚本的AJAX请求?

Edw*_*uay 17 javascript ajax extjs callback

在我的应用程序中,我Ext.Ajax.request用来加载我执行的脚本eval.

问题是,由于AJAX请求需要一段时间才能完成,之后执行的代码需要通过AJAX加载的脚本中的变量.在这个例子中,我展示了这种情况.如何更改此代码,以便在AJAX等待直到AJAX调用中的脚本加载并执行后执行JavaScript?

testEvalIssue_script.htm:

<script type="text/javascript">
    console.log('2. inside the ajax-loaded script');
</script>
Run Code Online (Sandbox Code Playgroud)

main.htm中:

<html>
    <head>
        <script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
        <script type="text/javascript">
            function loadViewViaAjax(url) {
                Ext.Ajax.request({
                    url: url,
                    success: function(objServerResponse) {
                        var responseText = objServerResponse.responseText;
                        var scripts, scriptsFinder=/<script[^>]*>([\s\S]+)<\/script>/gi;
                        while(scripts=scriptsFinder.exec(responseText)) {
                            eval.call(window,scripts[1]);
                        }
                    }
                });
            }

            console.log('1. before loading ajax script');
            loadViewViaAjax('testEvalIssue_script.htm');
            console.log('3. after loading ajax script');
        </script>
    </head>
    <body>

    </body>

</html>
Run Code Online (Sandbox Code Playgroud)

输出:

1. before loading ajax script
3. after loading ajax script
2. inside the ajax-loaded script
Run Code Online (Sandbox Code Playgroud)

如何使输出的顺序正确,如下所示:

1. before loading ajax script
2. inside the ajax-loaded script
3. after loading ajax script
Run Code Online (Sandbox Code Playgroud)

Chr*_*isR 12

Ajax是异步的,这意味着调度了ajax调用,但是你的代码在不停止的情况下继续像以前一样运行.在收到响应之前,Ajax不会停止/暂停执行.你必须添加一个额外的回调函数或类似的东西.

<html>
    <head>
        <script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
        <script type="text/javascript" src="ext/ext-all-debug.js"></script>
        <script type="text/javascript">
            function loadViewViaAjax(url, callback) {
                Ext.Ajax.request({
                    url: url,
                    success: function(objServerResponse) {
                        var responseText = objServerResponse.responseText;
                        var scripts, scriptsFinder=/<script[^>]*>([\s\S]+)<\/script>/gi;
                        while(scripts=scriptsFinder.exec(responseText)) {
                            eval.call(window,scripts[1]);
                        }
                        callback.call();
                    }
                });
            }

            console.log('1. before loading ajax script');
            var afterAjax = function(){
                console.log('3. after loading ajax script');
            }
            loadViewViaAjax('testEvalIssue_script.htm', afterAjax);
        </script>
    </head>
    <body>

    </body>

</html>
Run Code Online (Sandbox Code Playgroud)