异步Fetch获取数据后,入队JS能否始终访问全局变量jsonObj?
问题确认:动态加载脚本能否稳定访问异步获取的全局变量
以下是main.js中的代码实现:
async function read() { const response = await fetch('http://localhost/data.json'); return response.text(); } let jsonObj; read().then((jsonStr) => { jsonObj = JSON.parse(jsonStr); enqueueJS(); }); function enqueueJS() { let script = document.createElement('script'); script.src = '/data_process.js'; document.body.appendChild(script); }
需要确认:无论fetch请求耗时多久,data_process.js是否始终能访问到全局变量jsonObj?
结论:该方案始终有效
只要fetch请求最终成功完成,不管耗时长短,data_process.js都能稳定访问到赋值后的jsonObj,核心原因有两点:
- 严格的执行顺序保证:
fetch的.then回调只会在请求成功拿到响应文本、完成jsonObj赋值后才会执行,紧接着才会调用enqueueJS()触发data_process.js的加载。整个流程是串行的,不存在脚本先加载完成但jsonObj还未赋值的情况。 - 浏览器脚本加载机制:动态创建的
<script>标签被添加到DOM后,浏览器才会发起请求加载脚本文件,加载完成后才会执行脚本内的代码。此时jsonObj已经是完成赋值的全局变量,完全可以正常访问。
补充说明:如果fetch请求失败(比如网络异常、文件不存在),.then回调不会执行,jsonObj会保持初始的undefined,同时data_process.js也不会被加载。但这属于请求失败的异常场景,和“请求耗时多久”的前提无关。
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

