2017-04-16 4 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 약속 미들웨어가 필요한 것을 발견했습니다. – user7875611