2017-04-16 13 views
0

私の非同期処理に問題があります。アクションfetchPostsSuccess()またはfetchPostsFailiure()が実行されているときに、fetchPosts()アクションが呼び出され、 '読み込み'ステートがfalseに設定されているときに、 '読み込み'状態をtrueに設定したいとします。要求の完了後にRedux非同期アクションがトリガーされました。どうして?

私の現在のコードでは、fetchPosts()がサーバーからの応答を受け取ったときに '読み込み'状態の変更以外はほとんど正常に動作し、要求の開始時にこの状態を変更したいと考えています。

ここに私のステップを示す簡単なコードがあります。 私はaxiosとredux-promise(https://github.com/acdlite/redux-promise)を使用しています。

// actions 
export function fetchPosts() { 
    const request = axios.get(`${API_URL}/posts/`); 
    return { 
    type: 'FETCH_POSTS', 
    payload: request, 
    }; 
} 

export function fetchPostsSuccess(posts) { 
    return { 
    type: 'FETCH_POSTS_SUCCESS', 
    payload: posts, 
    }; 
} 

export function fetchPostsFailure(error) { 
    return { 
    type: 'FETCH_POSTS_FAILURE', 
    payload: error, 
    }; 
} 


// reducer 
const INITIAL_STATE = { 
    posts: [], 
    loading: false, 
    error: null, 
} 
const postsReducer = (state = INITIAL_STATE, action) => { 
    switch (action.type) { 
    case 'FETCH_POSTS': 
     return { ...state, loading: true, error: null }; 
    case 'FETCH_POSTS_SUCCESS': 
     return { ...state, posts: action.payload, loading: false }; 
    case 'FETCH_POSTS_FAILURE': 
     return { ...state, posts: [], loading: false, error: action.payload }; 
    default: 
     return state; 
    } 
} 

const rootReducer = combineReducers({ 
    postsList: postsReducer, 
}); 


// store 
function configureStore(initialState) { 
    return createStore(
    rootReducer, 
    applyMiddleware(
     promise, 
    ), 
); 
} 
const store = configureStore(); 


// simple Posts app 
class Posts extends Component { 
    componentWillMount() { 
    this.props.fetchPosts(); 
    } 

    render() { 
    const { posts, loading } = this.props.postsList; 
    return (
     <div> 
     {loading && <p>Loading...</p>} 
     <ul> 
      {posts.map(post => <li key={post.id}>{post.title}</li>)} 
     </ul> 
     </div> 
    ); 
    } 
} 

const mapStateToProps = state => ({ 
    postsList: state.postsList, 
}); 

const mapDispatchToProps = dispatch => ({ 
    fetchPosts: (params = {}) => { 
    dispatch(fetchPosts()) 
     .then((response) => { 
     if (!response.error) { 
      dispatch(fetchPostsSuccess(response.payload.data)); 
     } else { 
      dispatch(fetchPostsFailure(response.payload.data)); 
     } 
     }); 
    }, 
}); 


const PostsContainer = connect(mapStateToProps, mapDispatchToProps)(Posts); 

// main 
ReactDOM.render((
    <Provider store={store}> 
    <Router history={browserHistory}> 
     <Route path="posts" component={PostsContainer} /> 
    </Router> 
    </Provider> 
), document.getElementById('appRoot')); 

私が間違っていることを教えてもらえますか?

答えて

0

「redux-promise」パッケージが問題であることが判明しました。この非同期ミドルウェアには、「保留状態」(「楽観的な更新」と呼ばれる)のようなものはありません。

約束が解決または拒否された場合にのみ状態が変更されます。

私はredux-promiseである「楽観アップデート」

0

あなたの問題を可能とする別のミドルウェアを使用する必要があります。代わりにredux-thunkを使用して、関数を返して複数回送信できるようにする必要があります。それを見て;)!

+0

ありがとう、 実際、それはredux-promiseの問題です。私はredux-promise-middlewareが私が必要としていたものだとわかりました。 – user7875611

関連する問題