【发布时间】:2018-02-02 11:46:18
【问题描述】:
我是一名 NodeJs 开发人员,碰巧有一些 Web 应用程序。 我非常熟悉异步代码以及事件循环的工作原理。但是,我一直面临一个无法解决的问题,直到我意识到异步代码在被拆分为多个脚本标签时可能表现不同。 情况如下
- 我在头部有一个带有一些异步代码的脚本标签。这样的代码期望某些功能存在。该函数应以同步方式在第二个脚本标记上声明,因此在异步内容完成时该函数应该存在。
- 第二个脚本标签是 100% 同步的,它在代码中间创建了一个名为 boot 的函数。
让我用一些简化的代码来说明它:
// <script>
somePromise()
.then( ()=> window.boot())
// </script>
// < ... some html code and body >
// <script>
window.boot = function (){}
// </script>
由于 promise 回调应该异步执行,我希望它进入事件循环并允许其余的同步代码执行。
在某些浏览器上,这符合我的预期。当我说一些浏览器时,我是指不同用户在不同计算机上的浏览器,因为即使使用相同的浏览器品牌和版本,行为也会有所不同。但是,在某些情况下,promise 回调在第二个脚本标签有机会启动并引发错误之前执行。
这应该如何在浏览器上工作?是否每个脚本标签都执行到所有代码都执行完毕,甚至是异步的?如果是这样,为什么它适用于其他一些浏览器?
提前致谢。
【问题讨论】:
-
所有脚本都应该在body标签的底部(被广泛接受的约定)。尝试做同样的事情。
-
第二个脚本是否使用脚本标签中的
src属性加载? -
@traktor53 两个脚本都包含要执行的实际代码。
-
@waleed-lqbal 我正在使用一个已经以这种方式构建的框架,无论如何我的问题不是关于如何解决问题,我有几种方法来解决它,它是关于理解实际行为。
-
因为有时承诺会在与网络和解析器的竞争中获胜(失败?),并在其他代码准备好之前执行。为什么要在没有安全检查和重试窗口的情况下首先创建这种竞争条件?
标签: javascript html asynchronous