You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过阻塞线程实现同步API调用,让全局可访问接口数据?

解决方案:同步API调用实现全局数据共享

问题背景

需要在首个引入的JS文件中通过阻塞线程的同步API调用获取数据,将结果挂载到window.data,确保后续引入的JS文件能直接访问到该实际数据,且不调整现有文件引入结构、不合并文件、不在异步回调中导入其他文件。

现有代码问题

原代码使用async/await的fetch API,本质仍是异步操作,window.data会被赋值为一个Promise对象,而非接口返回的实际数据,后续JS执行时无法直接拿到结果。

简洁实现方案

fetch不支持同步调用,改用同步XMLHttpRequest(注意:主线程中同步XHR会阻塞页面渲染,仅适用于必须依赖该数据才能继续的场景),修改script1.js如下:

修改后的script1.js

function fetchDataSync() {
    const configUrl = 'https://jsonplaceholder.typicode.com/todos/1';
    const xhr = new XMLHttpRequest();
    
    try {
        // 第三个参数设为false开启同步模式
        xhr.open('GET', configUrl, false);
        xhr.send();

        if (xhr.status >= 200 && xhr.status < 300) {
            const res = JSON.parse(xhr.responseText);
            console.log('data 0:', res);
            return res;
        } else {
            throw new Error(`Network response was not ok: ${xhr.status} - ${xhr.statusText}`);
        }
    } catch (error) {
        console.error('Error fetching data:', error);
        return null;
    }
}

// 同步执行并直接赋值实际数据到window
window.data = fetchDataSync();

console.log("data 1:", window.data);

效果说明

  • 同步XHR会阻塞线程,直到请求完成并拿到结果后,才会继续执行后续的JS文件
  • window.data直接存储接口返回的JSON数据,而非Promise对象
  • script2.js执行时,console.log("data 2:", window.data)会打印出接口返回的真实数据

内容的提问来源于stack exchange,提问作者Agent 047

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:45:15