首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法弄清楚“错误:操作必须是纯对象。请使用自定义中间件进行异步操作。”

无法弄清楚“错误:操作必须是纯对象。请使用自定义中间件进行异步操作。”
EN

Stack Overflow用户
提问于 2018-01-21 03:57:53
回答 2查看 76关注 0票数 0

我正在使用React和Redux构建一个应用程序,以便从API请求并随后显示电影信息。在控制台中,我可以取回请求的数据,但在此之后,我遇到了错误-“错误:操作必须是纯对象。使用自定义中间件进行异步操作。”

到目前为止,这是我的代码。

搜索组件:

代码语言:javascript
运行
复制
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchMovie } from '../../actions/index';

class SearchBar extends Component {
  constructor(props) {
    super(props);

    this.state = { term: '' };

    this.onInputChange = this.onInputChange.bind(this);
    this.onFormSubmit = this.onFormSubmit.bind(this);
  }

  onInputChange(e) {
    this.setState({ term: e.target.value });
  }

  onFormSubmit(event) {
    event.preventDefault();
    this.props.fetchMovie(this.state.term); 
    this.setState({ term: '' });
  }

  render() {
    return (
      <div>
        <form onSubmit={this.onFormSubmit} className="input-group">
          <input
            placeholder="Search by movie title, actor, or genre"
            className="form-control"
            value={this.state.term}
            onChange={this.onInputChange}
          />
          <span className="input-group-btn">
            <button type="submit" className="btn btn-secondary">
              Submit
            </button>
          </span>
        </form>
        <br />
      </div>
    );
  }
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators({ fetchMovie }, dispatch);
}

export default connect(null, mapDispatchToProps)(SearchBar);

行动..。

代码语言:javascript
运行
复制
import axios from 'axios';

const API_KEY = '449a384f';

export const FETCH_MOVIE = 'FETCH_MOVIE';

let movies = [];

export function fetchMovie(term) {
  const request = axios
    .get(`http://www.omdbapi.com/?s=${term}&apikey=${API_KEY}`)
    .then(response => {
      movies = response.data;
      response.json = movies;
    })
    .catch(error => console.log(error));

  return {
      type: FETCH_MOVIE,
      payload: request,
    };
}

减速机...

代码语言:javascript
运行
复制
import { FETCH_MOVIE } from '../actions/index';

export default function(state = null, action) {
  switch (action.type) {
    case FETCH_MOVIE:
      return [action.payload.data, ...state];
  }
  return state;
}

CombineReducer...

代码语言:javascript
运行
复制
import { combineReducers } from 'redux';
import MovieReducer from './movie_reducer';

const rootReducer = combineReducers({
  movie: MovieReducer,
});

export default rootReducer;

商店...

代码语言:javascript
运行
复制
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
// import ReduxThunk from 'redux-thunk';
import { BrowserRouter, Switch, Route } from 'react-router-dom';

import { createStore, applyMiddleware } from 'redux';
import ReduxPromise from 'redux-promise';

import './index.css';
import App from './App';
import Login from './components/login/login';
import reducers from './reducers/reducer';
import '../node_modules/bootstrap/dist/css/bootstrap.min.css';
import { findDOMNode } from 'react-dom';
import $ from 'jquery';

const createStoreWithMiddleware = applyMiddleware(ReduxPromise)(createStore);

ReactDOM.render(
  <Provider store={createStoreWithMiddleware(reducers)}>
    <BrowserRouter>
      <Switch>
        <Route path="/Login" component={Login} />
        <Route path="/" component={App} />
      </Switch>
    </BrowserRouter>
  </Provider>,
  document.querySelector('#root')
);

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

发布于 2018-01-21 04:36:30

Vanilla Redux要求您在动作创建器中返回一个普通的JavaScript对象。每当需要执行异步操作时,都需要引入诸如redux-thunk或redux-promise之类的中间件来拦截返回的对象并执行额外的工作,以便最终返回一个普通的JavaScript对象。

您正在尝试使用redux-promise,但是您返回的内容不会导致调用中间件。您的fetchMovie()方法将返回一个包含Promise的纯对象。为了使用redux- Promise,该方法需要返回一个Promise。

从他们的documentation

代码语言:javascript
运行
复制
createAction('FETCH_THING', async id => {
  const result = await somePromise;
  return result.someValue;
});
票数 0
EN

Stack Overflow用户

发布于 2018-01-21 04:38:33

原因可能是您试图在action to reducer中返回promise。

你正在使用thunk,所以你总是可以从action creator中分派

代码语言:javascript
运行
复制
export const fetchMovie = term => dispatch => axios
  .get(`http://www.omdbapi.com/?s=${term}&apikey=${API_KEY}`)
  .then(response => {
    dispatch({
      type: FETCH_MOVIE,
      payload: response,
    });
  })
  .catch(error => console.log(error)); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48360486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档