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

createAsyncThunk中Premature Promise Fulfillment问题如何解决

问题根因

你的代码问题出在第一个请求的.then回调中没有返回第二个axios请求对应的Promise,导致外层Promise链没有等待第二个请求执行完成就直接变为已完成状态,createAsyncThunk就会提前触发fetchUserInfo.fulfilled。

修复方案

方案1:修改原有Promise链式写法

只需要在第一个请求的.then里新增return,把第二个请求的Promise抛出到外层链即可:

export const fetchUserInfo = createAsyncThunk(
  'fetchUserInfo',
  async (param1) =>
    axios
      .get(process.env.FIRST_CALL, {
        params: { code: param1 },
      })
      .then((firstCallResponse) => {
        // 新增return,把第二个请求的Promise接入外层链式
        return axios
          .get(process.env.SECOND_CALL, {
            headers: {
              token: firstCallResponse.data.token,
            },
          })
          .then((secondCallResponse) => {
            return {
              status: LoginStatus.SUCCESS,
              payload: { firstCallResponse, secondCallResponse },
            }
          })
          .catch((error) => {
            console.log(error)
            return { status: LoginStatus.SECONDCALL_FAILURE, payload: {} }
          })
      })
      .catch((error) => {
        console.log(error)
        return { status: LoginStatus.FIRSTCALL_FAILURE, payload: {} }
      }),
)

方案2:使用async/await写法(更推荐,可读性更高)

用async/await语法可以避免Promise链式漏写return的问题,逻辑更清晰:

export const fetchUserInfo = createAsyncThunk(
  'fetchUserInfo',
  async (param1) => {
    // 执行第一个请求
    let firstCallResponse
    try {
      firstCallResponse = await axios.get(process.env.FIRST_CALL, {
        params: { code: param1 },
      })
    } catch (error) {
      console.log(error)
      return { status: LoginStatus.FIRSTCALL_FAILURE, payload: {} }
    }

    // 执行第二个请求
    try {
      const secondCallResponse = await axios.get(process.env.SECOND_CALL, {
        headers: { token: firstCallResponse.data.token }
      })
      return {
        status: LoginStatus.SUCCESS,
        payload: { firstCallResponse, secondCallResponse }
      }
    } catch (error) {
      console.log(error)
      return { status: LoginStatus.SECONDCALL_FAILURE, payload: {} }
    }
  }
)

两种写法都可以保证所有请求无论成功失败,全部执行完成后才会返回最终结果给createAsyncThunk,触发对应状态的reducer。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:33:01