0

为什么我的 Promise 并没有真正更新 Redux 中的状态?

我正在使用 redux-promise-middleware。当我调用我的 API 时,它会执行 _PENDING 和 _FULFILLED 的承诺步骤,但状态永远不会更新以反映更改。

我该如何正确地做到这一点,以便我真正得到我的数据。


这是我的状态的图片:

_PENDING 和 _FULFILLED 状态

如您所见,isFetched在 promise 完成后不会变为 true,并且data永远不会将返回的响应数据加载到自身中。


这是我的 API 助手:

class UserAPI {

     ...

     async testPhone(user) {
         await axios.post(this.testPhonePath, {
             phone: user.phone
         })
         .then(function(response) {
             return response.data
         })
         .catch(function(error) {
             return error.response.data
         })
     }
}

我的行动:

import { UserAPI } from '../../constants/api'

const userAPI = new UserAPI()

export const TEST_USER_PHONE = 'TEST_USER_PHONE'

export const testUserPhone = (user) => ({
    type: TEST_USER_PHONE,
    payload: userAPI.testPhone(user)
})

还有我的减速机:

import {
    TEST_USER_PHONE
} from './actions'

const INITIAL_STATE = {
    testedByPhone: {
        data: [],
        isFetched: false,
        error: {
            on: false,
            message: null
        }
    }
}

export default (state = INITIAL_STATE, action) => {
    switch(action.type) {
        case '${TEST_USER_PHONE}_PENDING':
            return INITIAL_STATE
        case '${TEST_USER_PHONE}_FULFILLED':
            return { 
                testedByPhone: {
                    data: action.payload,
                    isFetched: true,
                    error: {
                        on: false,
                        message: null
                    }
                }
            }
        case '${TEST_USER_PHONE}_REJECTED':
            return { 
                testedByPhone: {
                    data: [],
                    isFetched: true,
                    error: {
                        on: true,
                        message: action.payload
                    }
                }
            }
        default:
            return state
    }
}


这是我的商店

import { createStore, applyMiddleware, compose } from 'redux'
import promiseMiddleware from 'redux-promise-middleware'

import reducers from './reducers'

const middleware = [
    promiseMiddleware()
]

if (__DEV__) {
    const logger = require('redux-logger')

    middleware.push(logger())
}

const enhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose

export default createStore(
    reducers,
    undefined,
    enhancers(applyMiddleware(...middleware))
)

4

2 回答 2

2

它不起作用的原因是您使用标准字符串而不是 JS 模板。代替:

'${TEST_USER_PHONE}_REJECTED'

和:

`${TEST_USER_PHONE}_REJECTED`
于 2017-03-29T00:10:49.570 回答
0

我怀疑你想使用

testPhone(user) {
    return axios.post(this.testPhonePath, {
        phone: user.phone
    }).then(function(response) {
        return response.data
    }, function(error) {
        return error.response.data
    });
}

或者

async testPhone(user) {
    try {
        const response = await axios.post(this.testPhonePath, {
            phone: user.phone
        });
        return response.data
    } catch(error) {
        return error.response.data
    }
}

但不是那种总是返回承诺的当前组合undefined- 它只使用await但不使用return.

于 2017-03-28T23:23:08.587 回答