javascript - API调用期间如何在reducer函数中返回状态

标签 javascript reactjs asynchronous async-await fetch

我有一个 reducer 函数,我必须在其中进行 API 调用,然后将其结果作为状态返回。但是由于 API 调用是异步的,因此 state 的值不会更新。

if (action.type==='CREATE_POST') {
        const x= async () => {
            const res=await  fetch("http://localhost:5000/posts", {
                  method: "post",
                  headers: {
                      'Accept': 'application/json',
                      'Content-Type': 'application/json'
                  },
                  body: JSON.stringify(
                      action.payload
                  )
              })
                  const data= await res.json()
              return data
          }
          return [...state,x]
}
我也试过这个
if (action.type==='CREATE_POST') {
        const x= async () => {
            const res=await  fetch("http://localhost:5000/posts", {
                  method: "post",
                  headers: {
                      'Accept': 'application/json',
                      'Content-Type': 'application/json'
                  },
                  body: JSON.stringify(
                      action.payload
                  )
              })
                  const data= await res.json()
              return data
          }
          return [...state,x().then((data)=>{console.log(data);})]

    }

最佳答案

如果您正在执行异步任务,我建议您使用以下模式:
创建 3 个文件,命名为:

  • reducer .js
  • action.js
  • effect.js(用于异步任务)

  • 在 reducer
    const initialState = {
      loading: false,
      data: [],
      error: ''
    }
    
    const reducer = (state = initialState, action) => {
      switch (action.type) {
        case "FETCH_REQUEST":
          return {
            ...state,
            loading: true
          }
        case "FETCH_SUCCESS":
          return {
            loading: false,
            data: action.payload,
            error: ''
          }
        case "FETCH_FAILURE":
          return {
            loading: false,
            data: [],
            error: action.payload
          }
        default: return state
      }
    }
    
    export default reducer
    
    在 action.js 中
    export const fetchRequest = () => {
        return {
          type: "FETCH_REQUEST"
        }
      }
      
      export const fetchSuccess = data => {
        return {
          type: "FETCH_SUCCESS",
          payload: data
        }
      }
      
      export const fetchFailure = error => {
        return {
          type: "FETCH_FAILURE",
          payload: error
        }
      }
    
    
    最后是 effect.js
    export const fetch = () => {
        return (dispatch) => {
            //Initializing the request
            dispatch(fetchRequest());
            //Calling the api
            api()
                .then((response) => {
                    // response is the data
                    dispatch(fetchSuccess(response));
                })
                .catch((error) => {
                    // error.message is the error message
                    dispatch(fetchFailure(error.message));
                });
        };
    };
    

    关于javascript - API调用期间如何在reducer函数中返回状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68533607/

    相关文章:

    javascript - 从 InnerHtml 添加链接按钮

    javascript - 我试图在 REACT 中加密密码,以便每个字母都将打印为星号 ` * `

    c# - Try-catch 不等待内部的异步函数

    python异步上下文管理器

    ios - Swift 3 - 未调用完成处理程序

    javascript - 如何在数据表 Angular 中基于 JSON 动态填充表值?

    javascript - 手机浏览器网页解决方案

    javascript - PM2 是要在开发过程中使用吗?

    reactjs - 一种清除 react 浏览器历史记录的方法?

    javascript - 更改元素(如固定 Logo )颜色,具体取决于 React 中的部分