1

我正在使用react和redux的项目,我已经足够新,所以我想更好地了解如何使用redux-thunk和redux一起赞成。 下面你可以看到我的文件,在我的动作中,我创建了一个获取通用函数apiFetch(),以便每次需要获取时使用。这个函数返回一个承诺,我要在loadBooks()中解析,代码正在工作,记录被上传,但是当我检查行为日志时,我发现第一个行为是未定义的,在有BOOKS_LOADING之后, LOAD_BOOKS,BOOKS_LOADING和LOAD_BOOKS_SUCCESS。以正确的方式使用redux-promise-middleware的redux-thunk

我有关于2个问题:

1)为什么是第一个未定义的动作,我已经LOAD_BOOKS而不是比LOAD_BOOKS_START?

action @ 22:54:37.403 undefined 
core.js:112 prev state Object {activeBook: null, booksListing: Object} 
core.js:116 action function (dispatch) { 
     var url = './src/data/payload.json'; 
     dispatch(booksIsLoading(true)); 
     return dispatch({ 
      type: 'LOAD_BOOKS', 
      payload: new Promise(function (resolve) { 
… 
core.js:124 next state Object {activeBook: null, booksListing: Object} 
action @ 22:54:37.404 BOOKS_LOADING 
action @ 22:54:37.413 LOAD_BOOKS 
action @ 22:54:39.420 BOOKS_LOADING 
action @ 22:54:39.425 LOAD_BOOKS_SUCCESS 

2)举例来说,如果为获取网址是错误的,我期望看到的动作LOAD_BOOKS_ERROR,这实际上是对数的结果是:

action @ 23:06:06.837 undefined action @ 23:06:06.837 BOOKS_LOADING 
action @ 23:06:06.846 LOAD_BOOKS GET 
http://localhost:8000/src/data/payldoad.json 404 (Not Found) error 
apiFetch Error: request failed at index.js:66 error 
TypeError: Cannot read property 'json' of undefined at index.js:90 

如果我不使用apiFetch(),但是正常的读取函数,所有工作都正常,也是错误的一部分,除了LOAD_BOOKS不是LOAD_BOOKS_START。

非常感谢您的帮助!

configureStore.js

import { createStore, applyMiddleware, compose, preloadedState } from 'redux'; 
import reducers from './configureReducer'; 
import configureMiddleware from './configureMiddleware'; 

const middleware = configureMiddleware(); 
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 
const store = createStore(reducers, preloadedState, composeEnhancers(applyMiddleware(...middleware))); 
export default store; 

动作/ index.js

import fetch from 'isomorphic-fetch'; 

export const booksIsLoading = (bool) => { 
    return { 
    type: 'BOOKS_LOADING', 
    booksLoading: bool, 
    }; 
}; 

const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); 

export const apiFetch = (url) => { 
    const getPromise =() => (
    fetch(url, { 
     method: 'GET', 
    }) 
     .then((response) => { 
     if (response.status !== 200) { 
      throw Error('request failed'); 
     } 
     return response; 
     }) 
     .catch((err) => { 
     console.log('error apiFetch', err); 
     // dispatch(fetchBooksError(true)); 
     }) 
); 
    return getPromise(); 
}; 

export const loadBooks =() => (dispatch) => { 
    const url = './src/data/payload.json'; 
    dispatch(booksIsLoading(true)); 
    return dispatch({ 
    type: 'LOAD_BOOKS', 
    payload: new Promise((resolve) => { 
     delay(2000).then(() => { 
     apiFetch(`${url}`) 
      // fetch(`${url}`, { 
      // method: 'GET', 
      // }) 
      .then((response) => { 
      resolve(response.json()); 
      dispatch(booksIsLoading(false)); 
      }).catch((err) => { 
      console.log('error', err); 
      }); 
     }); 
    }), 
    }); 
}; 

常数/的application.js

export const LOAD_BOOKS = 'LOAD_BOOKS'; 

减速器/ reducer_book.js

import initialState from '../model.js'; 
import * as types from '../constants/application'; 

export default function (state = initialState, action) { 
    switch (action.type) { 
    case `${types.LOAD_BOOKS}_SUCCESS`: { 
     console.log('reducer', action.payload); 
     const data = action.payload.data.items; 
     const items = Object.values(data); 

     if (items.length > 0) { 
     return { 
      ...state, 
      books: Object.values(data), 
      booksFetched: true, 
      booksError: false, 
     }; 
     } 

     return state; 
    } 

    case `${types.LOAD_BOOKS}_ERROR`: { 
     return { 
     ...state, 
     booksError: true, 
     }; 
    } 

    case 'BOOKS_LOADING': 
     return { 
     ...state, 
     booksLoading: action.booksLoading, 
     }; 

    default: 
     return state; 
    } 
} 

回答

0

它看起来像你有一个语法错误。查看你声明getPromise()的apiFetch()。

const getPromise =() => (
    ...    ^
); 
^
0

你指定了哪些中间件?

以下的使用使得行动去未定义:

'applyMiddleware(reduxPromiseMiddleware(),reduxThunk)'

请更改为:(!咚第一)

“applyMiddleware(reduxThunk,reduxPromiseMiddleware ())'