在异步延迟问题上运行多个脚本[重复]

Posted

技术标签:

【中文标题】在异步延迟问题上运行多个脚本[重复]【英文标题】:Running multiple scripts on async defer problems [duplicate] 【发布时间】:2020-05-25 13:41:02 【问题描述】:

我有 2 个脚本应该使用异步延迟运行。但问题是第二个脚本依赖于第一个脚本。 js-map-label.js 需要在 googleapis 已加载并运行后运行。 80% 的时间都可以使用此设置。但有时它不会运行,所以我不得不一遍又一遍地刷新,直到 js-map-label.js 运行。有没有办法解决这个问题?

这些脚本按以下顺序排列:

    ...
    <script src="https://maps.googleapis.com/maps/api/js?key=__MY_KEY_HERE__...." async defer></script>
    <script src="/static/js/js-map-label.js" async defer></script>
    ...
</body>

有时会引发此错误:

js-map-label.js:13 Uncaught ReferenceError: google is not defined
    at js-map-label.js:13
    at js-map-label.js:16

【问题讨论】:

Script Tag - async & defer 的副本 @MrUpsidown 据我所知,您所说的可能重复的这篇文章似乎没有考虑同时使用异步和延迟,也没有讨论其后果。这个问题对我来说似乎不是重复的 @jeprubio 引用已接受的答案:如果您的第二个脚本依赖于第一个脚本(例如,您的第二个脚本使用第一个脚本中加载的 jQuery),那么您无法制作它们async 不需要额外的代码来控制执行顺序,但是你可以让它们延迟,因为延迟脚本仍然会按顺序执行,只是在文档被解析之后。 - 这不是我们在这里讨论的内容吗?您的答案中还包括什么? @MrUpsidown 好吧,即使我同意它非常相似,我仍然认为它不一样。如果大家觉得都一样可以关闭,当然我也没什么好说的了。我只是指出,其他问题和答案似乎没有考虑使用脚本并与 OP 一样使用脚本和延迟以及后果。例如,它并没有说这是一个可能的回退,并且在这种情况下这将是不同浏览器中的行为。只是这个。对我来说,这个问题更进一步,但这只是我的意见 @MrUpsidown 正如我所说,我“暂时”接受了答案,因为它解决了我目前的困境。是否应该有一段时间我需要在异步延迟上运行两者? (不确定是否会有任何东西。) 【参考方案1】:

使用defer,文件被异步下载,但仅在文档解析完成时执行。同样使用 defer,脚本将按照它们被调用的顺序执行。这使得当一个脚本依赖于另一个脚本时延迟选择属性。

使用async,文件会异步下载,然后在下载后立即执行。

在您的情况下,您可以使用 defer 以便在文档解析完成时执行 javascript,但如果您希望保留依赖项, async

<script src="https://maps.googleapis.com/maps/api/js?key=__MY_KEY_HERE__...." defer></script>
<script src="/static/js/js-map-label.js" defer></script>

实际上,defer 用于需要整个 DOM 和/或其相对执行顺序很重要的脚本。异步用于独立脚本,例如计数器或广告。并且它们的相对执行顺序无关紧要。

来自规范:https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async

即使指定了 async 属性,也可以指定 defer 属性,以导致仅支持 defer(而不是异步)的旧版 Web 浏览器回退到 defer 行为而不是默认的同步阻塞行为。

因此,如果您同时使用两种现代浏览器,则只会执行异步操作,并且不会保持执行顺序。

【讨论】:

谢谢,它现在可以工作了 XD。但我可以发誓我试过这个。哈哈。还要感谢关于何时使用它们的最佳实践:)

以上是关于在异步延迟问题上运行多个脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

异步 JavaScript - 回调与延迟/承诺 [重复]

JavaScript值延迟脚本和异步脚本

在 Wordpress 中延迟内联脚本

异步地理定位 API 和 jQuery 延迟对象 [重复]

HTML5 脚本标签,延迟等待任何以前的异步脚本

调用服务器的 PHP 脚本是不是异步运行?