Problem with redux middleware - Error: Actions must be plain objects. Use custom middleware for async actions
Problem with redux middleware - Error: Actions must be plain objects. Use custom middleware for async actions
我有一个小问题无法解决。我正在制作一个使用 Redux 的应用程序。我想创建一个动作创建者来调度另一个动作。我已经包含了 redux-thunk 中间件,但我仍然遇到同样的错误。
我试图直接在这些调度中传递对象,而不是 returns 这些对象的方法,但仍然出现相同的错误。此外,我一直在尝试以不同的方式应用 redux-thunk,但仍然出现相同的错误。
这位是大动作创作者:
import {fetchMoviesBegin, fetchMoviesSuccess, fetchMoviesFailure} from
'../movie-results/movie-results.action';
const API_KEY = "d14e23d0";
export const getResults = async (inputValue) => {
return dispatch => {
dispatch(fetchMoviesBegin());
return (async () => {
try {
const getAPIS = await fetch(`http://www.omdbapi.com/?a
pikey=${API_KEY}&s=${inputValue}`);
const apiTOJSON = await getAPIS.json();
//Array ID's assignment
const returnedValues = apiTOJSON.Search;
const getIDS = returnedValues.map(item => item.imdbID);
//Array full of fetched items info
const fetchInfo = await Promise.all(getIDS.map(id =>
fetch(`http://www.omdbapi.com/?apikey=${API_KEY}&i=${id}`).then(item
=> item.json())));
//Here is the sorted array full of movies with details
fetchInfo.sort((a, b) => (a.imdbRating > b.imdbRating) ? -1 : 1);
dispatch(fetchMoviesSuccess(fetchInfo));
return fetchInfo;
}catch(error) {
return () => dispatch(fetchMoviesFailure(error));
}
})()
}
}
这些操作如下:
import {MovieResultsTypes} from './movie-results.types';
export const setMovieResults = results => ({
type: MovieResultsTypes.FETCH_MOVIE_TITLES,
payload: results
})
export const fetchMoviesBegin = () => ({
type: MovieResultsTypes.FETCH_MOVIES_BEGIN
})
export const fetchMoviesSuccess = movies => ({
type: MovieResultsTypes.FETCH_MOVIES_SUCCES,
payload: {movies}
})
export const fetchMoviesFailure = error => ({
type: MovieResultsTypes.FETCH_MOVIES_FAILURE,
payload: {error}
})
这是带有中间件的商店:
import {createStore, applyMiddleware} from 'redux';
import logger from 'redux-logger';
import thunk from 'redux-thunk';
import rootReducer from './root-reducer';
const middlewares = [logger, thunk];
export const store = createStore(rootReducer,
applyMiddleware(...middlewares));
如果有人遇到这个问题,请帮助:/
你能试试这个语法吗?
另外为什么需要 return fetchInfo?当store发生变化时,连接到store的组件会自动获取新的数据。
export function getResults(inputValue) {
return async (dispatch) => {
dispatch(fetchMoviesBegin());
try {
dispatch(fetchMoviesBegin());
const getAPIS = await fetch(`http://www.omdbapi.com/?apikey=${API_KEY}&s=${inputValue}`);
const apiTOJSON = await getAPIS.json();
//Array ID's assignment
const returnedValues = apiTOJSON.Search;
const getIDS = returnedValues.map(item => item.imdbID);
//Array full of fetched items info
const fetchInfo = await Promise.all(getIDS.map(id => fetch(`http://www.omdbapi.com/?apikey=${API_KEY}&i=${id}`)
.then(item => item.json())));
//Here is the sorted array full of movies with details
fetchInfo.sort((a, b) => (a.imdbRating > b.imdbRating) ? -1 : 1);
dispatch(fetchMoviesSuccess(fetchInfo));
// return fetchInfo;
}
catch (error) {
console.log('error: ', error);
dispatch(fetchMoviesFailure(error));
}
}
}
我有一个小问题无法解决。我正在制作一个使用 Redux 的应用程序。我想创建一个动作创建者来调度另一个动作。我已经包含了 redux-thunk 中间件,但我仍然遇到同样的错误。
我试图直接在这些调度中传递对象,而不是 returns 这些对象的方法,但仍然出现相同的错误。此外,我一直在尝试以不同的方式应用 redux-thunk,但仍然出现相同的错误。
这位是大动作创作者:
import {fetchMoviesBegin, fetchMoviesSuccess, fetchMoviesFailure} from
'../movie-results/movie-results.action';
const API_KEY = "d14e23d0";
export const getResults = async (inputValue) => {
return dispatch => {
dispatch(fetchMoviesBegin());
return (async () => {
try {
const getAPIS = await fetch(`http://www.omdbapi.com/?a
pikey=${API_KEY}&s=${inputValue}`);
const apiTOJSON = await getAPIS.json();
//Array ID's assignment
const returnedValues = apiTOJSON.Search;
const getIDS = returnedValues.map(item => item.imdbID);
//Array full of fetched items info
const fetchInfo = await Promise.all(getIDS.map(id =>
fetch(`http://www.omdbapi.com/?apikey=${API_KEY}&i=${id}`).then(item
=> item.json())));
//Here is the sorted array full of movies with details
fetchInfo.sort((a, b) => (a.imdbRating > b.imdbRating) ? -1 : 1);
dispatch(fetchMoviesSuccess(fetchInfo));
return fetchInfo;
}catch(error) {
return () => dispatch(fetchMoviesFailure(error));
}
})()
}
}
这些操作如下:
import {MovieResultsTypes} from './movie-results.types';
export const setMovieResults = results => ({
type: MovieResultsTypes.FETCH_MOVIE_TITLES,
payload: results
})
export const fetchMoviesBegin = () => ({
type: MovieResultsTypes.FETCH_MOVIES_BEGIN
})
export const fetchMoviesSuccess = movies => ({
type: MovieResultsTypes.FETCH_MOVIES_SUCCES,
payload: {movies}
})
export const fetchMoviesFailure = error => ({
type: MovieResultsTypes.FETCH_MOVIES_FAILURE,
payload: {error}
})
这是带有中间件的商店:
import {createStore, applyMiddleware} from 'redux';
import logger from 'redux-logger';
import thunk from 'redux-thunk';
import rootReducer from './root-reducer';
const middlewares = [logger, thunk];
export const store = createStore(rootReducer,
applyMiddleware(...middlewares));
如果有人遇到这个问题,请帮助:/
你能试试这个语法吗?
另外为什么需要 return fetchInfo?当store发生变化时,连接到store的组件会自动获取新的数据。
export function getResults(inputValue) {
return async (dispatch) => {
dispatch(fetchMoviesBegin());
try {
dispatch(fetchMoviesBegin());
const getAPIS = await fetch(`http://www.omdbapi.com/?apikey=${API_KEY}&s=${inputValue}`);
const apiTOJSON = await getAPIS.json();
//Array ID's assignment
const returnedValues = apiTOJSON.Search;
const getIDS = returnedValues.map(item => item.imdbID);
//Array full of fetched items info
const fetchInfo = await Promise.all(getIDS.map(id => fetch(`http://www.omdbapi.com/?apikey=${API_KEY}&i=${id}`)
.then(item => item.json())));
//Here is the sorted array full of movies with details
fetchInfo.sort((a, b) => (a.imdbRating > b.imdbRating) ? -1 : 1);
dispatch(fetchMoviesSuccess(fetchInfo));
// return fetchInfo;
}
catch (error) {
console.log('error: ', error);
dispatch(fetchMoviesFailure(error));
}
}
}