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

Vue中使用Promise调用API获取数据失败排查:请求后代码不执行且无法获取数据

问题分析与修复方案

你的问题核心在于手动创建的Promise没有调用resolve或reject,导致Promise一直处于挂起(pending)状态,await会无限等待这个Promise完成,后续代码自然无法执行。另外还有个小问题:axios的请求本身就返回Promise,没必要额外再包一层Promise,这属于冗余操作还容易出错。

第一步:修复repository.js中的代码

推荐方案(去掉冗余的Promise包装)

既然axios的get方法本身就返回Promise,直接return它即可,async函数会自动把返回值包装成Promise:

async getAllContactRequests() {
  return axios.get("http://127.0.0.1:8000/api/contactRequests", {
    headers: {
      "Authorization": "Bearer " + sessionStorage.getItem("user_token")
    }
  });
}

如果你坚持要手动包装Promise(不推荐)

必须在axios请求完成后调用resolve传递结果,同时用reject处理错误,避免Promise一直挂起:

async getAllContactRequests() {
  return new Promise((resolve, reject) => {
    axios.get("http://127.0.0.1:8000/api/contactRequests", {
      headers: {
        "Authorization": "Bearer " + sessionStorage.getItem("user_token")
      }
    })
    .then(response => resolve(response)) // 关键:兑现Promise,传递响应数据
    .catch(error => reject(error)); // 处理错误,避免Promise挂起
  });
}

第二步:优化Vue组件中的代码

使用await时可以直接获取响应结果,无需额外的.then,同时建议加上try/catch处理请求失败的情况:

<script>
import repository from "@/api/repository";
export default {
  name: "posts-index",
  data() {
    return {
      apiData: null,
    };
  },
  async mounted() {
    console.log("This prints");
    try {
      const response = await repository.getAllContactRequests();
      this.apiData = response.data;
      console.log("This will print now!");
    } catch (error) {
      // 处理请求失败的情况,比如token无效、网络错误等
      console.error("Failed to load contact requests:", error);
    }
  },
};
</script>

为什么原来的代码会卡住?

你创建的Promise没有调用resolve,它永远不会进入"已兑现"(fulfilled)状态,await会一直等待这个Promise完成,导致后续代码被阻塞,永远执行不到。这是使用Promise时很常见的新手错误——忘记兑现或拒绝Promise。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:13:11