javascript - 多个 JavaScript 代码的执行顺序

标签 javascript html web

我有下一个 HTML 代码:

<!-- Virtual Router Section -->
<div id="virtualRouterSection" class="col-lg-12 col-xs-12">
    {% include "network-virtualRouter.html" %}
</div>

<!-- Zones Section -->
<div id="zonesSection" class="col-lg-12 col-xs-12">
    {% include "network-zones.html" %}
</div>

<!-- Profiles Section -->
<div id="profilesSection" class="col-lg-12 col-xs-12">
    {% include "network-profiles.html" %}
</div>

<!-- Ipsec Tunnel Section -->
<div id="ipsecTunnelSection" class="col-lg-12 col-xs-12">
    {% include "network-ipsecTunnel.html" %}
</div>

每个network-* HTML脚本都有自己的JS代码,如下(network-virtualRouter.html示例):

<script type="text/javascript">
    $.getScript("{% static 'network-virtualRouter.js' %}");
</script>

那么问题来了:JS代码是如何解释的?在我看来,network-virtualRouter.js将首先执行。之后是network-zones.js等。 这是正确的吗?

先谢谢了,

迈克。

最佳答案

$.getScript 异步。您正在按照您看到的顺序开始抓取脚本的过程,但是这些请求可能以任何顺序完成(取决于资源、线程的大小)服务器上的调度、网络变化等)。无论哪个先完成,都将首先运行,可能不按请求的顺序运行。

<小时/>

在您提出的评论中:

However, I would like to execute the JS scripts in the order they are requested. How could i do that?

如果我假设您想要进行最小的更改(而不是切换到模块或其他东西),那么您可以使用 Promise 链,无论是使用 native Promise(或用于 native Promise 的 Polyfill)还是 jQuery 的 Deferred 对象。

使用原生 promise :每次调用 $.getScript看起来像这样:

var getScriptPromise = getScriptPromise || Promise.resolve();
getScriptPromise = getScriptPromise.then(function() {
    return $.getScript("{% static 'network-virtualRouter.js' %}");
});

$.Deferred :每次调用 $.getScript看起来像这样:

var getScriptPromise = getScriptPromise || $.Deferred().resolve().promise();
getScriptPromise = getScriptPromise.then(function() {
    return $.getScript("{% static 'network-virtualRouter.js' %}");
});

在这两种情况下,我们都使用 var 的语义在全局范围内创建变量(如果它是文档中的第一个变量)或使用现有变量(如果不是)。如果我们创造了它,我们就创造了一个兑现的 promise 。如果我们没有创建它,我们将使用它已经引用的 promise 。然后我们使用 then从它链接并进行下一个调用 $.getScript$.getScript返回一个thenable,因此从 then 返回它兑现 promise then$.getScript返回thenable ,这意味着它等待 thenable 稳定并以相同的方式稳定。

最终结果:每个 $.getScript直到前一个通话结束后,此通话才会开始。

如果您想让所有请求同时启动,然后按顺序运行返回的脚本,则必须使用 $.ajax相反,要检索脚本文本,则可能 $.globalEval 当您知道轮到该脚本时运行它。

关于javascript - 多个 JavaScript 代码的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750071/

相关文章:

javascript - 以编程方式关闭 Bootstrap 中的模式对话框并在提交时显示另一个页面

html - 我如何在CSS中绘制内半径?

html - 如何在 DIV 中的长单词中强制换行?

html - 输入转换

javascript - 生成pdf支持阿拉伯语

javascript - 如何仅打印包含在 php 代码中的 html,如打印收据

javascript - 从 .ascx 文件调用 Javascript 函数时出错

javascript - 将 "this"传递给自定义 Tap 事件回调的正确方法

php - 从不同目录深度的不同页面动态添加相同的CSS文件

javascript - HTML Web Audio API - 左右声道的音频可视化