inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

React로 NodeBird SNS 만들기

REDUX-SAGA 동작에 대한 질문

384

귯결~소쥬촤락

작성한 질문수 17

0

//saga.js
function* action() {
yield axios.get('/').then(()=>{ console.log("API!") })
yield call(()=>{ console.log('ACTION!') })
}

function* watchAction() {
  yield takeEvery(ACTION, action)
}

function* useSaga() {
  yield all([fork(watchAction)])
}
//index.js
const Index = () => {
  const dispatch = useDispatch()
  useEffect(() => {
    dispatch({
      type: ACTION,
    })

    console.log('INDEX PAGE')
  }, [])

  return (
    <></>
  )
}
INDEX PAGE
API!
ACTION
이순으로 콘솔이 찍히게 되는데욥
API!
ACTION
INDEX PAGE
이렇게 콘솔을 찍히게 할 수 있는 방법이 있을 까요??
//index.js
const Index = () => {
  const dispatch = useDispatch()
  useEffect(() => {
   axios.get('/').then(()=>{
console.log("API!")
return Promise.resolve()
})
.then(()=>{
dispatch({
      type: ACTION,
    })
return Promise.resolve()
})
.then(()=>{
console.log('INDEX PAGE')
})
  }, [])

  return (
    <></>
  )
}
이렇게 하면 동작은 되지만 REDUX-SAGA를 이용해서 해결을 하고 싶어서욥..

javascript react

답변 5

0

제로초(조현영)

이 부분은 https://github.com/ZeroCho/react-nodebird/blob/master/ch8/front/pages/signup.js#L32

에서처럼 useEffect에서 처리해야겠습니다.

또는 서버사이드인 경우 server.js에서 백엔드의 isLoggedIn 미들웨어같은 것과 라우터를 만들어서 처리해도 되겠습니다.

0

귯결~소쥬촤락

console.log는 그냥 확인차 찍어본거구요.

const { store,res , isServer } = ctx

store.dispatch({ type : LOAD_USER_REQUEST})

if(isServer){

   const isLogged = store.getState().user.isLogged

   if(!isLogged){

       res.writeHead(301, { Location : '/login' })

       res.end()

  }

}else{

  Router.push('/login')

}

이런 로직을 구현하고 싶은데요. api요청에 응답이 오기전에 

if문이 있는 라인이 실행이 되어서요..

이런 로직들은 saga의 함수가 있는 쪽에 넣는게 더 옳은 걸까요?????

0

제로초(조현영)

getInitialProps 안에서 console.log를 찍으실 이유가 없습니다. 컴포넌트에서 콘솔을 찍으시면 서버사이드렌더링 시에는 console.log가 더 뒤에 나올 겁니다. 다만, 클라이언트사이드렌더링 시에는 console.log가 먼저 나옵니다.

0

귯결~소쥬촤락

아니요.. 아예 다른 문제입니다.

INDEX PAGE
API!
ACTION
이순으로 콘솔이 찍히게 되는데욥
API!
ACTION
INDEX PAGE
이렇게 콘솔을 찍히게 할 수 있는 방법이 있을 까요??
이 문제에 대한 질문입니다.
getInitialProps에서도 똑같은 문제입니다...
getInitialProps = (context) => {
dispatch({type : LOAD_USER_REQUEST })
console.log(context.ctx.store.getState().user.isLogged)
}
만약에 이런 동작을 실행하고 싶다면 어떻게 해야할까요??
API요청 후 응답이 오기전에
console.log(context.ctx.store.getState().user.isLogged)
이 코드가 실행됩니다.
dispatch({ type : LOAD_USER_REQUEST }) --> API요청 --> put({ type : LOAD_USER_SUCCESS }) --> console.log()
이 순으로 동작을 원합니다. 하지만 실제 동작은
dispatch( type : LOAD_USER_REQUEST }) -> API요청 -> console.log(isLogged)->put({ type : LOAD_USER_SUCCESS })
이렇게 됩니다.
요점을 말하자면 _app.js의 getInitialProps함수에서 API요청 응답 후 그 다음 로직이 실행되길 원합니다. 응답전에 실행되는게 아니라요

0

제로초(조현영)

화면 렌더링 전에 액션을 실행하고 싶으신 거죠? getInitialProps에서 하셔야 합니다.

next 10 이상에서는 redux dev tool 구동이 안되나요?

0

272

1

세션 갱신 문의 건

0

484

7

배포 진행 후 Highlight updates components render 표시

0

445

1

똑같은 기능을 하는 테이블

0

448

4

관계형

0

312

2

프론트 서버를 이용하지 않는경우

1

299

3

인피니트 스크롤링 사용시 오류

0

278

0

계속 이런에러가 떠서 해결하기는 했는데 어떤 의미인지 모르겠습니다.

0

435

2

req.user가 언제 생성되나요??

0

330

2

Cannot read property 'id' of null 에러

0

333

1

리트윗한 게시글 불러오는 sequelize

0

252

1

result.data에서 images인 이유

0

281

2

takeLatest에 대한 질문입니다.

1

342

2

프론트에서 express를 사용하지 않을때 동적라우팅

0

501

6

getInitialProps가 클라이언트에서 수행되는 이유?

0

258

1

리로드하면 팔로우 언팔로우 값이 초기화 되는 문제입니다.

0

445

2

스타일드 컴포넌트와 className을 통한 스타일 적용의 차이에 대해 궁금합니다

0

585

2

할인 쿠폰 사용이 안되는되요 (848-f9af83f183e3)

0

365

1

nodejs mvc 패턴

0

976

4

사용하고 보니, 람다 구성이 궁금합니다!

0

266

1

제로초님

0

445

1

새로고침 로그인 풀림 문제.

0

247

1

안녕하세요. 강의 너무 감사합니다

0

157

1

제로초님

0

170

1