2017-02-21 1 views
0

저는 Promise/thunk를 미들웨어로 사용하고 있습니다. 그것은 위대한 작품.promise/thunk를 사용하여 감속기로 인수 인수

알아낼 수없는 일이 있습니다. 다음 작품 :

this.props.dispatch(addTag({ name: name, photoId: this.props.photoId})) 

내 작업을 썽크에 싸여 아약스를 실행하고 약속 반환 :

export function addTag(payload) { 


var url = "/api/photos/".concat(payload.photoId, "/addtag?name=" ,payload.name) 
    return function(dispatch) { 
    var request = new Request(url, {headers: headers}); 
    fetch(request) 
     .then((response) => { 
     dispatch({type: "ADD_TAG", payload: response.json()}) 
     }) 
     .catch((err) => { 
     dispatch({type: "ADD_TAG", payload: err}) 
     }) 
    } 
} 

을하고 만회를 집어

내 구성 요소에서 작업을 파견 :

case 'ADD_TAG_FULFILLED': { 
    newState = state 
     .set('tags', action.payload.tags) 
     .set('inputValue', '') 
    return newState 
    } 

이제 액션에 전달되는 페이로드를 감속기? (내가 상태로 돌아가서 구성 요소로 돌아가려면 ... 나는 썬크와 약속 미들웨어 기능을 "깨뜨리는"것을 혼합하여이 작업을 수행 할 수 있습니다.이게 최상의 솔루션입니까?

export function addTag(payload) { 
    var url = "/api/photos/".concat(payload.photoId, "/addtag?name=" ,payload.name) 
    return function(dispatch) { 
    var request = new Request(url, {headers: headers}); 
    fetch(request) 
     .then((response) => { 
     return (response.json()) 
     }) 
     .then((json) => { 
     dispatch({type: "ADD_TAG", payload: {suggestions: json, pl: payload}) 
     }) 
     .catch((err) => { 
     dispatch({type: "ADD_TAG", payload: err}) 
     }) 
    } 
} 
+0

왜 당신이 미들웨어 기능을 깨고 말을 할 – Lucas

+0

문제의 구성 요소는 새로운 REDUX 상태를 받아야한다 (구성 요소 상태와 혼동하지 말 것) 소품으로 사용하고 계십니까? eact-redux '와 connect() 함수를 사용하면 어떻게됩니까? – ferndopolis

+1

당신이 파견 할 수있는 한 행동을 발동하고 페이로드를 감속기에 전달할 수 있습니다. ->이 예에서는 페치가 성공적으로 수행 된 경우에만 페이로드를 전달합니다. 항상 디스패치하려는 경우 catch 문 다음 약속에서 수행하십시오. (당신이 원하는대로 체인 수 있습니다) – Mateusz

답변

0

감사

솔루션은 @Mateusz :

export function tagInput(tagInput) { 
    var url = '/api/photos/get_tag_list?term='.concat(tagInput); 
    return function (dispatch) { 
    var request = new Request(url, { headers: headers, method: 'GET' }); 
    fetch(request) 
     .then(response => { 
     dispatch({ type: 'TAG_INPUT', payload: response.json() }); 
     }) 
     .catch((err) => { 
     dispatch({ type: 'TAG_INPUT_ERROR', payload: err }); 
     }) 
     .then(() => { 
     dispatch({ type: 'TAG_INPUT_VALUE', payload: tagInput }); 
     }); 
    }; 
}