【问题标题】:How to get normal json object from Promise Object in react-redux [duplicate]如何从 react-redux 中的 Promise 对象获取正常的 json 对象 [重复]
【发布时间】:2018-06-18 03:02:09
【问题描述】:

如何从 react-redux 中的 Promise 对象获取普通的 JSON 对象?

我的 action.js 包含:

  export function allEmp() {
      let url = "employees?access_token=";
      let result = ApiCall.getApiCall(url)
      .then(function (response) {
         return response;
       })
       .catch(function (error) {
         return error;
       });
       console.log("result",result);
       return {
         type: "ALL_EMP",
         payload: new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(result);
                }, 2000);
            })
       };
     }

我的 API 调用配置是:

getApiCall(url) {
    let base_url = "http://192.168.1.151:3000/api/";
    let api_token = "1f7169e92c1d0722db575b877707cf0b88b8f0ad";
    let fetch_url = base_url + url + api_token;
    let myHeaders = new Headers({
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    });
    return fetch(fetch_url, {
      method: "GET",
      headers: myHeaders
    })
    .then(function(response) {
      if (response.ok) {
        return response.json();
      } else {
        var error = new Error(response.statusText);
        error.response = response;
        throw error;
      }
    })
    .then(function(json) {
      return json;
     })
  }

我的 store.js :

import {createStore, combineReducers, applyMiddleware} from "redux";
import thunk from "redux-thunk";
import promise from "redux-promise-middleware";

import userDetails from "./reducers/User_reducer";

export default createStore(
    combineReducers({
        userDetails
    }),
    {},
    applyMiddleware(thunk, promise())
);

但是在这里我得到了 Promise 对象。因此,当我在有效负载中分配时,它变得未定义。当我将响应作为有效负载发送时,我应该如何操作它。

谁能给我一些建议?

【问题讨论】:

  • 此解决方案有效。但在那个例子中,已经使用了 axios,我正在使用 fetch。谢谢。
  • 嗨,Shubham 这种方法不适用于发布请求。你能帮忙吗??导出函数 loginDetails(input) { let url = "admins/api_login";调试器; return (dispatch) => { dispatch({type: "LOGIN_FETCH"}); ApiCall.postApiCall(url, input) .then((response) => { dispatch({type: "LOGIN_SUCCESS", payload: response}); }) .catch((error) => { dispatch({type: "LOGIN_FAIL ", 有效载荷: 错误}); }) } }
  • const mapStateToProps = (state) => { return { sessionReducer: state.sessionReducer }; }; const mapDispatchToProps = (dispatch) => { return { loginDetails: (login_details, loggedIn, error, payload) => { dispatch(loginDetails(login_details, loggedIn, error, payload)); } }; }; export default connect(mapStateToProps, mapDispatchToProps)(Signin);
  • const sessionReducer = (state = {INITIAL_STATE},action) => { switch(action.type){ case "LOGIN_FETCH": state={ ...state, login_details: action.payload, loggedIn: false }; break; case "LOGIN_SUCCESS": state={ ...state, loggedIn: true, error: null }; break; case "LOGIN_FAIL": state={ ...state, loggedIn: false, error: action.payload }; break; default: break; } return state; }; export default sessionReducer;
  • 现在的问题是 API 调用没有发生。

标签: javascript reactjs redux promise react-redux


【解决方案1】:

Promises 表示可能无法立即使用的异步进程。它们提供了一种在结果准备好时触发处理程序的方法(因此您的 Javascript 可以继续执行并完成其他工作)。

要访问它们的结果,您可以在 .then 方法中放置一个处理程序,该方法在解析时调用并接收结果作为参数。

见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

你可以考虑编写你的函数:

export function allEmp() {
  p = new Promise();

  let url = "employees?access_token=";
  ApiCall.getApiCall(url)
  .then(function (response) {
     console.log("result",result);    
     p.resolve({
                type: "ALL_EMP",
                payload: response})
            })
   .catch(function (error) {
      console.log("error",error);  
     p.reject(error)
   });

 return p  // allEmp now returns a promise which gives it a .then() method to contain your handler code.
 }

然后像这样调用你的函数:

allEmp().then(
 function(res){/*handle it here, not called until async resolves, receives result*/},
 function(err){/*or resolves to error, receives error*/}
 )

您还可以考虑查看 await/async 语法,它使您的代码看起来好像正在等待异步操作,并且在大多数情况下可以增强可读性。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

【讨论】:

  • 你能给我一个语法例子吗?我已经更新了问题。
  • 感谢您的回答
【解决方案2】:

react-redux 不支持开箱即用的异步动作创建器,因此您需要向项目添加依赖项。

看看redux-thunk middleware,它增加了对异步动作创建者的支持。

redux-thunk 的想法是,一旦异步代码解析,您的动作创建者将触发另一个动作。

在您的情况下,您将有一个 allEmp 动作创建者,一旦 Promise 解决,它就会调用另一个动作 receiveAllEmp

allEmp Action Creator(使用 redux-thunk)

export function allEmp() {

    return (dispatch) => {

        return ApiCall.getApiCall(url).then((response) => {

            // Dispatch the receiveAllEmp action

            dispatch(receiveAllEmp(response));

            return response;
        });
    };
}

receiveAllEmp Action Creator(普通动作创建者)

export function receiveAllEmp(response) {
    return {
        type: "ALL_EMP",
        payload: response,
    };
}

【讨论】:

  • 同意,redux-thunk 很棒。但是由于动作创建者可以调度其他动作创建者(可能是异步操作的结果),您当然可以使用承诺编写异步动作创建者 - 他们只是不能返回承诺。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2017-11-03
  • 2018-05-16
  • 2015-02-22
  • 2021-07-23
  • 1970-01-01
相关资源
最近更新 更多