2016-08-09 3 views
1

내 fetch() 함수의 실행을 제어하는 ​​데 문제가 있습니다. 특히 사용자가 스팸 fetch() 요청을 보내지 않도록하고 싶습니다.언제 Redux에서 fetch()가 발생합니까?

내 생각은 미들웨어의 내부를 수행했지만, 시간 페치와 액션()는 페이로드가 이미 약속이 가져옵니다.

그래서 제 질문은, 때 정확하게 인출 않습니다()가 이미 실행하세요? 이 중요한 경우

후 내 코드는 대략 다음과 같습니다.

부모 조치 :

{ 
    return (dispatch) => { 
    if (mode === 'MY') { 
     dispatch(myAction(...); 
    } 

    dispatch(someOtherAction(...)); 
    } 
} 

내 조치 :

{ 
    type: 'TYPE', 
    promise: post(url, payload) 
} 

내 포스트 방법 :

{ 
    console.log('sending POST'); 

    return fetch(url, { 
    //fetch info 
    }); 
} 

내 미들웨어 :

{ 
    return next => action => { 

    const { promise, //other fields } = action; 
    //Already a promise here. 

    if (!promise) { 
     return next(action); 
    } 

    return promise.then(
     //Processing data 
    ); 
    }; 
} 
+0

, 나는 ... "... 액션 작성자 함수를 반환하면, 그 함수가 돌아 오는 썽크 미들웨어에 의해 실행 얻을 것이다"이 라인 우연히. 그렇다면 Redux-Thunk 때문에 내 문제가 발생 했습니까? 내 행동이 파견 될 때마다 Redux-Thunk는 내 맞춤형 미들웨어에 도달하기 전에 즉각적으로 내 기능을 실행합니다. –

답변

0

내 생각은 미들웨어의 내부를 수행했지만, 시간 페치와 액션()는 페이로드가 이미 약속이 가져옵니다.

이 문제를 해결하기 위해 작업 내에서 수표로 사용합니다. 따라서 가져 오기 요청을 실행하면 가져 오기가 현재 실행중인 작업을 보내고 상태를 fetching = true으로 업데이트하십시오. 그런 다음 가져 오기를 사용해야하는 다른 작업에서 해당 상태를 확인하고 사실이면 아무 것도 반환하지 않습니다. 그 즉시 물론

당신이 행동 작성자 전화

라고 :

는 귀하의 코멘트에 대답합니다. 디스패치를 ​​호출하면 함수가 실행됩니다 (redux-thunk를 사용하는 경우). 이제는 redux-thunk가 미들웨어이기 때문에 미들웨어를 부착 한 주문에 따라 실행됩니다. 그래서 당신이 redux thunk 전에 셋업에 자신의 미들웨어를 넣으면, 그 전에 실행될 것입니다.

const store = createStore(
    combineReducers(reducers), 
    applyMiddleware(yourMiddleware, ReduxThunk) 
); 

그렇지 않으면 이해가 정확합니다. 액션은 dispatch를 호출 한 직후에 발생합니다. 미들웨어를 순서대로 처리 한 다음 작업 정보를 감속기로 전달합니다. 돌아 오는 워드 프로세서를 통해 읽기

+0

답변 해 주셔서 감사합니다. 나는 나의 미들웨어의 순서를 변경 시도하고 내 사용자 지정 미들웨어에 무슨 일이 있을지 기록. 나는 그것이 여전히 약속을 받고있는 것으로 나타났습니다. 썬크에 도달하기 전에 먼저 내 미들웨어를 통과한다면 약속 대신 내 게시 방법을 기록하면 안됩니까? –

+0

미들웨어 내에서 dispatch() 및 next()에 전달한 내용은 무엇이며 미들웨어가받을 것입니다. 따라서 action.promise()를 호출하고 다음 미들웨어에 다른 것을 전달하려면 새 객체를 생성하여 next()에 전달해야합니다. redux-thunk는 함수와 관련된 특별한 일을하지 않습니다.그것은 단지 객체 대신에 반환되는 함수를 처리하는 방법을 알고 있습니다. 그것은 간단합니다. https://github.com/gaearon/redux-thunk/blob/master/src/index.js – agmcleod

관련 문제