Redux: μ—¬λŸ¬ 비동기 ν˜ΈμΆœμ„ κΈ°λ‹€λ¦¬λŠ” redux κ΄€μš©κ΅¬λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

에 λ§Œλ“  2015λ…„ 09μ›” 14일  Β·  30μ½”λ©˜νŠΈ  Β·  좜처: reduxjs/redux

λ°˜μ‘ ꡬ성 μš”μ†Œλ₯Ό μ‹œμž‘ν•  λ•Œ 두 가지 비동기 http ν˜ΈμΆœμ„ λ§Œλ“€κ³  κ²°κ³Όλ₯Ό κΈ°λ‹€λ €μ•Όν•©λ‹ˆλ‹€.
이 두 ν˜ΈμΆœμ€ μ΄μƒμ μœΌλ‘œ 데이터λ₯Ό 두 개의 λ‹€λ₯Έ 감속기에 λ„£μŠ΅λ‹ˆλ‹€.

단일 비동기 호좜 νŒ¨ν„΄μ„ μ΄ν•΄ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬ 비동기 ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜κ³  λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜κ³  κ²°κ³Όκ°€ 도착할 λ•ŒκΉŒμ§€ _both_ κΈ°λ‹€λ¦¬κΈ°μœ„ν•œ 쒋은 μƒ˜ν”Œμ„ λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€.

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” redux 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

Redux Thunk 미듀웨어λ₯Ό μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

μ•‘μ…˜ μ œμž‘μžλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

import 'babel-core/polyfill'; // so I can use Promises
import fetch from 'isomorphic-fetch'; // so I can use fetch()

function doSomething() {
  return dispatch => 
    fetch(
      '/api/something'
    ).then(
      response => response.json()
    ).then(
      json => dispatch({ type: DO_SOMETHING, json }),
      err => dispatch({ type: SOMETHING_FAILED, err })
    );
}

function doSomethingElse() {
  return dispatch => 
    fetch(
      '/api/something'
    ).then(
      response => response.json()
    ).then(
      json => dispatch({ type: DO_SOMETHING_ELSE, json }),
      err => dispatch({ type: SOMETHING_ELSE_FAILED, err })
    );
}

썽크 μ•‘μ…˜ μƒμ„±μž λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’μœΌλ‘œ 체인을 μœ μ§€ν•˜μ—¬ 맨 끝에 Promise λ₯Ό λ°˜ν™˜ν•˜λŠ” 방법에 μ£Όλͺ©ν•˜μ‹­μ‹œμ˜€. μ΄λ ‡κ²Œν•˜λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

store.dispatch(doSomething()).then(() => {
  console.log('I did something');
});

Redux Thunkλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 dispatch λŠ” 썽크 μž‘μ—… μƒμ„±μž (이 경우 Promise)μ—μ„œ λ°˜ν™˜ ν•œ ν•¨μˆ˜μ˜ λ°˜ν™˜ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œν•˜λ©΄ Promise.all() 와 같은 μ‘°ν•©μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μž‘μ—…μ΄ μ™„λ£Œ 될 λ•ŒκΉŒμ§€ 기닀릴 수 μžˆμŠ΅λ‹ˆλ‹€.

Promise.all([
  store.dispatch(doSomething()),
  store.dispatch(doSomethingElse())
]).then(() => {
  console.log('I did everything!');
});

κ·ΈλŸ¬λ‚˜ 이전 μ•‘μ…˜ μ œμž‘μžμ˜ _composition_ 역할을 ν•  λ‹€λ₯Έ μ•‘μ…˜ μ œμž‘μžλ₯Ό μ •μ˜ν•˜κ³  λ‚΄λΆ€μ μœΌλ‘œ Promise.all μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

function doEverything() {
  return dispatch => Promise.all([
    dispatch(doSomething()),
    dispatch(doSomethingElse())
  ]);
}

이제 κ·Έλƒ₯ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€

store.dispatch(doEverything()).then(() => {
  console.log('I did everything!');
});

ν–‰λ³΅ν•œ 파견!

λͺ¨λ“  30 λŒ“κΈ€

Redux Thunk 미듀웨어λ₯Ό μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

μ•‘μ…˜ μ œμž‘μžλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

import 'babel-core/polyfill'; // so I can use Promises
import fetch from 'isomorphic-fetch'; // so I can use fetch()

function doSomething() {
  return dispatch => 
    fetch(
      '/api/something'
    ).then(
      response => response.json()
    ).then(
      json => dispatch({ type: DO_SOMETHING, json }),
      err => dispatch({ type: SOMETHING_FAILED, err })
    );
}

function doSomethingElse() {
  return dispatch => 
    fetch(
      '/api/something'
    ).then(
      response => response.json()
    ).then(
      json => dispatch({ type: DO_SOMETHING_ELSE, json }),
      err => dispatch({ type: SOMETHING_ELSE_FAILED, err })
    );
}

썽크 μ•‘μ…˜ μƒμ„±μž λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’μœΌλ‘œ 체인을 μœ μ§€ν•˜μ—¬ 맨 끝에 Promise λ₯Ό λ°˜ν™˜ν•˜λŠ” 방법에 μ£Όλͺ©ν•˜μ‹­μ‹œμ˜€. μ΄λ ‡κ²Œν•˜λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

store.dispatch(doSomething()).then(() => {
  console.log('I did something');
});

Redux Thunkλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 dispatch λŠ” 썽크 μž‘μ—… μƒμ„±μž (이 경우 Promise)μ—μ„œ λ°˜ν™˜ ν•œ ν•¨μˆ˜μ˜ λ°˜ν™˜ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œν•˜λ©΄ Promise.all() 와 같은 μ‘°ν•©μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μž‘μ—…μ΄ μ™„λ£Œ 될 λ•ŒκΉŒμ§€ 기닀릴 수 μžˆμŠ΅λ‹ˆλ‹€.

Promise.all([
  store.dispatch(doSomething()),
  store.dispatch(doSomethingElse())
]).then(() => {
  console.log('I did everything!');
});

κ·ΈλŸ¬λ‚˜ 이전 μ•‘μ…˜ μ œμž‘μžμ˜ _composition_ 역할을 ν•  λ‹€λ₯Έ μ•‘μ…˜ μ œμž‘μžλ₯Ό μ •μ˜ν•˜κ³  λ‚΄λΆ€μ μœΌλ‘œ Promise.all μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

function doEverything() {
  return dispatch => Promise.all([
    dispatch(doSomething()),
    dispatch(doSomethingElse())
  ]);
}

이제 κ·Έλƒ₯ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€

store.dispatch(doEverything()).then(() => {
  console.log('I did everything!');
});

ν–‰λ³΅ν•œ 파견!

@gaearon promise 미듀웨어보닀 thunk 을 μ„ ν˜Έν•˜λŠ” νŠΉλ³„ν•œ μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ? λ˜λŠ” μ–Έμ œ 무엇을 μ‚¬μš©ν•΄μ•Όν•˜λŠ”μ§€μ— λŒ€ν•œ μ‘°μ–Έ? 감사.

νŠΉλ³„ν•œ μ΄μœ λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ €λŠ” 그것에 λŒ€ν•΄ 더 잘 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.
λ‘˜ λ‹€ μ‹œλ„ν•˜κ³  κ°€μž₯ μ ν•©ν•œ 것을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€!

μ•Œκ² μŠ΅λ‹ˆλ‹€, κ°μ‚¬ν•©λ‹ˆλ‹€!

JFYI :)
screen shot 2015-09-14 at 11 06 42 am

μ›ν•˜λŠ” 경우 https://github.com/Cron-J/redux-async-transitions μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

@gaearon λΉ λ₯Έ 질문-μœ„μ˜ 예λ₯Όλ³΄κ³  μ „ν™”ν•˜μ‹­μ‹œμ˜€.

store.dispatch(doSomething()).then(() => {
  console.log('I did something');
});

β€” doSomething κ±°λΆ€ 된 κ²½μš°μ—λ„ "I did something"블둝이 νžˆνŠΈν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 였λ₯˜λ₯Ό μž‘μ€ ν›„ doSomething μ²΄μΈμ—μ„œ 였λ₯˜λ₯Ό λ‹€μ‹œ λ˜μ§€μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ˜λ„μ μž…λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우-λŒ€μ‹  였λ₯˜λ₯Ό λ‹€μ‹œ λ°œμƒμ‹œν‚€λŠ” 경우-ν˜ΈμΆœμžμ—μ„œ λ‹€μ‹œ 처리 ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

그것은 단지 μ˜ˆμΌλΏμž…λ‹ˆλ‹€. μ €λŠ” 이것을 λ³΄λŠ” λ°©λ²•μœΌλ‘œμ„œ, 이것이 결정적인 μ°Έμ‘°λΌλŠ” μ˜λ―Έκ°€ μ•„λ‹™λ‹ˆλ‹€. λ‚˜λŠ” 그것에 λŒ€ν•΄ μ§„μ§€ν•˜κ²Œ μƒκ°ν•˜μ§€ μ•Šμ•˜λ‹€.

μ•‘μ…˜ μ œμž‘μžλ‘œλΆ€ν„° 약속을 λ°˜ν™˜ν•˜λŠ” 방법을 μ•Œκ³  있으며 λ‚˜λ¨Έμ§€λŠ” κ·€ν•˜μ—κ²Œ 달렀 μžˆμŠ΅λ‹ˆλ‹€. 였λ₯˜λ₯Ό λ‹€μ‹œ 던질 지 여뢀와 처리 μœ„μΉ˜λŠ” λͺ¨λ‘ κ·€ν•˜μ—κ²Œ 달렀 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œ Redux의 λ¬Έμ œκ°€ μ•„λ‹ˆλ―€λ‘œ λ‚΄ 쑰언은 λ‹€λ₯Έ μ‚¬λžŒλ§ŒνΌ μ’‹μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€! 그것이 사싀이라고 μƒκ°ν–ˆμ§€λ§Œ λ‚΄κ°€ κ°„κ³Ό ν•œ λ§ˆλ²•μ΄ μ—†λŠ”μ§€ ν™•μΈν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

ReduxλŠ” μ‚¬μš©μž μ •μ˜κ°€ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— dispatch λ°˜ν™˜ 값이 μ˜ˆμƒλ˜λŠ” 약속이라고 보μž₯ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ redux-loopλ₯Ό μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— μ‹€μƒν™œμ—μ„œ ν•œ 가지 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λž˜ν•‘ 된 Promise (https://github.com/raisemarketplace/redux-loop/blob/master/modules/effects.js#L38)λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ dispatch 을 μ‘°μ •ν•©λ‹ˆλ‹€. λ”°λΌμ„œ dispatch 의 λ°˜ν™˜ 값에 의쑴 ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

κΈ€μŽ„, Dan이이 μŠ€λ ˆλ“œμ—μ„œ μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ : 그것은 _your_ 앱이고, _you_λŠ” λ‹Ήμ‹ μ˜ μ•‘μ…˜ μ œμž‘μžλ₯Ό μž‘μ„±ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ _you_ 그듀이 무엇을 λ°˜ν™˜ν• μ§€ κ²°μ •ν•˜μ‹­μ‹œμ˜€.

@markerikson dispatch λ°˜ν™˜ 값은 미듀웨어가 μ‘°μ •ν•  수 μžˆμœΌλ―€λ‘œ μ•‘μ…˜ μƒμ„±μžμ˜ λ°˜ν™˜ 값이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ‹  체인의 then 에 dispatch(actonCreator()) , μš°λ¦¬κ°€ ν•  μˆ˜μ— 체인 actionCreator() .

예, λ―Έλ“€μ›¨μ–΄λŠ” μ‘°μ •ν•  수 μžˆμ§€λ§Œ λ‚΄ μš”μ μ€ _you_κ°€ μžμ‹ μ˜ μ•±μ—μ„œ 미듀웨어λ₯Ό μ„€μ •ν•˜κ³  μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. :)

@gaearon λ‹˜ , λΉ λ₯Έ (κ΄€λ ¨λœ) μ§ˆλ¬Έμž…λ‹ˆλ‹€! 같은 일에 λŒ€ν•œ λ‹Ήμ‹ μ˜ κ²¬ν•΄λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

function fetchDataBWhichDependsOnA() {
  return dispatch => {
    dispatch(fetchDataA())
      .then(() => {
        fetch('/api/get/data/B')
          .then(dispatch(receiveDataB(response.data)))
      })
  }
}

이 μ½”λ“œ μ‘°κ°μ—λŠ” 2 개의 쀑첩 된 비동기 μž‘μ—…μ΄ μžˆμ§€λ§Œ μž‘λ™ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. fetchDataA() μ—λŠ” 비동기 호좜 μˆ˜μ€€μ΄ 1 개만 있기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ fetchDataBWhichDependsOnA() λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ €κ³  ν•  λ•Œ then λΈ”λ‘μ˜ store μ—μ„œ κ°€μž₯ μ—…λ°μ΄νŠΈ 된 값을 검색 ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@timothytong 약속을 λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. dispatch 및 쀑첩 된 fetch ν˜ΈμΆœμ—μ„œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λ©΄ 전체 체인이 ν•΄κ²° 될 λ•ŒκΉŒμ§€ ν…ŒμŠ€νŠΈμ—μ„œ 기닀릴 수 μžˆμŠ΅λ‹ˆλ‹€.

@johanneslumpe 쒋은 캐치, κ³ λ§ˆμ›Œ 친ꡬ! 이제 남은 것은 이것이 ν—ˆμš© κ°€λŠ₯ν•œμ§€ 여뢀에 λŒ€ν•œ μ§ˆλ¬Έμž…λ‹ˆλ‹€. 비동기 κ°€μ Έ 였기 체인으둜 데이터 쒅속성을 μ²˜λ¦¬ν•©λ‹ˆκΉŒ?

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆκ³  30 λΆ„ λ™μ•ˆ 해결책을 μ°ΎκΈ° μœ„ν•΄ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€. 이 κ΅¬ν˜„μ€ 아직 μ™„λ£Œλ˜μ§€ μ•Šμ•˜μ§€λ§Œ μ œλŒ€λ‘œ μ§„ν–‰λ˜κ³ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

https://github.com/Sailias/sync-thunk

λ‚΄ 생각은 그것이 그듀을을 μ±„μš°κ³  체인 μž‘μ—…μ„ ν˜ΈμΆœν•˜λŠ”μ§€λ„λ₯Ό μ°Έμ‘°ν•΄μ•Όν•˜μ§€ μ•Šμ„ 경우 ꡬ성 μš”μ†Œκ°€ μ±„μ›Œ νŠΉμ • REDUX μƒνƒœλ₯Ό μš”μ²­ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ then . 체인의 각 μž‘μ—…μ€ 데이터λ₯Ό 전달할 ν•„μš”κ°€ μ—†μœΌλ©° 쒅속 μž‘μ—…μ΄ 데이터λ₯Ό 채웠을 λ•Œ μƒνƒœμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

@gaearon

Promise.all([
  store.dispatch(doSomething()),
  store.dispatch(doSomethingElse())
]).then(() => {
  console.log('I did everything!');
});

이것에 λŒ€ν•œ 질문이 μžˆμŠ΅λ‹ˆλ‹€. λ„ˆλ¬΄ 기본적인 경우 μ£„μ†‘ν•©λ‹ˆλ‹€.

이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” 두 번의 λ””μŠ€νŒ¨μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 즉, ꡬ성 μš”μ†Œκ°€ 두 번 λ Œλ”λ§λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ꡬ성 μš”μ†Œκ°€ 두 데이터 λͺ¨λ‘ μ˜λ―ΈμžˆλŠ” 것을 ν‘œμ‹œν•˜κΈ°λ₯Ό μ›ν•˜λ©΄ μ–΄λ–»κ²Œν•΄μ•Όν• κΉŒμš”?

λ”°λΌμ„œμ΄ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” ꡬ성 μš”μ†Œκ°€ ν•œ 번만 λ Œλ”λ§λ˜κΈ°λ₯Ό μ›ν•˜λ©° μ΄λ•Œ λͺ¨λ“  비동기 μž‘μ—…μ΄ μ™„λ£Œλ©λ‹ˆλ‹€.

redux-batched-subscribe 및 redux-batched-actions 와

이것이 μœ νš¨ν•œ μ‹œλ‚˜λ¦¬μ˜€λΌλ©΄μ΄λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ œμ•ˆ 된 μ ‘κ·Ό 방식은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

@jintoppy ꡬ성 μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ €λ©΄ Promise.all μ†”λ£¨μ…˜μ΄ λ„μ›€μ΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. doSomething() and doSomething() λͺ¨λ‘ μƒνƒœ 변경을 νŠΈλ¦¬κ±°ν•˜κ³  ꡬ성 μš”μ†Œ λ Œλ”λ§μ„ μœ λ°œν•˜λŠ” λͺ¨λ“  λ””μŠ€νŒ¨μΉ˜ 데이터 λ•Œλ¬Έμž…λ‹ˆλ‹€.

@jintoppy μ™œ 상황을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ middlwaresκ°€ ν•„μš”ν•©λ‹ˆκΉŒ?
그런 μ§“μ„ν•˜λŠ” 데 λ°©ν•΄κ°€λ˜λŠ” 것은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

// action creator
function fetchAB() {
  return dispatch => {
    const fetchA = fetch( 'api/endpoint/A' );
    const fetchB = fetch( 'api/endpoint/B' );
    return Promise.all([ fetchA, fetchB ])
      .then( values => dispatch(showABAction(values)) )
      .catch( err => throw err );
  }
} 

λͺ¨λ“  μš”μ²­μ„ ν•˜λ‚˜μ˜ μ•‘μ…˜ μƒμ„±μžμ— λ„£κ³  λͺ¨λ“  μš”μ²­μ΄ ν•΄κ²° 된 후에 만 β€‹β€‹μ•‘μ…˜ λ””μŠ€νŒ¨μΉ˜λ₯Ό ​​싀행할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우 감속기가 ν˜ΈμΆœλ˜μ–΄ μƒνƒœκ°€ ν•œ 번만 λ³€κ²½λ˜μ—ˆμœΌλ―€λ‘œ render ()도 ν•œ 번만 싀행될 κ²ƒμž…λ‹ˆλ‹€.

@apranovich :이 μ ‘κ·Ό 방식에 λ¬Έμ œκ°€ ν•˜λ‚˜ μžˆμŠ΅λ‹ˆλ‹€. 이제 단일 μž‘μ—…μ—μ„œ μ—¬λŸ¬ κ°€μ Έ 였기λ₯Ό κ²°ν•©ν•΄μ•Όν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ λ§Œμ•½ λ‚΄κ°€ 10 개의 비동기 ν˜ΈμΆœμ„ 가지고 μžˆλ‹€λ©΄, λͺ¨λ“  것을 ν•˜λ‚˜μ˜ μ•‘μ…˜μ— λ„£μ–΄μ•Όν•©λ‹ˆλ‹€. λ˜ν•œ λ‚˜μ€‘μ— μ΄λŸ¬ν•œ 10 개의 비동기 호좜 쀑 ν•˜λ‚˜λ₯Ό νŠΈλ¦¬κ±°ν•˜λ €λ©΄ μ–΄λ–»κ²Œν•΄μ•Όν•©λ‹ˆκΉŒ? 이 μ ‘κ·Ό λ°©μ‹μ—μ„œ 기본적으둜 λͺ¨λ“  비동기 λ…Όλ¦¬λŠ” 단일 μž‘μ—…μ— μžˆμŠ΅λ‹ˆλ‹€.

μœ μš©ν•œ 정보에 λŒ€ν•΄ λͺ¨λ‘ κ°μ‚¬ν•©λ‹ˆλ‹€. λΉ λ₯Έ 질문, μ–΄λ–»κ²Œ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆμ§€λ§Œ ν•œ νŽ˜μΉ˜κ°€ λ‹€μŒ 페치 λ©”μ„œλ“œμ— ν•„μš”ν•œ 데이터λ₯Ό λ°˜ν™˜ ν•  λ•Œμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μœ„μΉ˜μ˜ 날씨λ₯Ό κ°€μ Έ 였기 μœ„ν•΄ λ‹€μŒ fetch 에 ν•„μš”ν•œ ID (첫 번째 fetch )λ₯Ό μ–»κΈ° μœ„ν•΄ 지리적 μœ„μΉ˜λ₯Ό μž…λ ₯ν•˜λŠ” 무료 날씨 API μ—”λ“œ ν¬μΈνŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이것이 μ΄μƒν•œ μ‚¬μš© μ‚¬λ‘€λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ μœ μ‚¬ν•œ 상황을 μ²˜λ¦¬ν•˜λŠ” 방법을 μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @gaearon ,이 μ§ˆλ¬Έμ— λŒ€ν•œ κ·€ν•˜μ˜ 리뷰λ₯Ό λ°›κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 두 개의 API에 λŒ€ν•΄ 쀑첩 된 비동기 ν˜ΈμΆœμ„ν•΄μ•Όν•©λ‹ˆλ‹€. 두 번째 API의 응닡은 첫 번째 API의 응닡에 따라 λ‹€λ¦…λ‹ˆλ‹€.

export const getApi=()=>{
        return(d)=>{
        axios({
            method:'GET',
            url:Constants.URLConst+"/UserProfile",
            headers:Constants.headers
        }).then((response)=>{
            return d({
                type:GET_API_DATA,
                response,
                axios({
                    method:'GET',
                    url:Constants.URLConst+"/UserProfileImage?enterpriseId="+response.data.ProfileData.EnterpriseId,
                    headers:Constants.headers
                }).then((response1)=>{
                    return d({
                        type:GET_PROFILE_IMAGE,
                        response1
                    })
                })
            })
        }).catch((e)=>{
            console.log("e",e);
        })
    }

}

μœ„μ™€ 같은 것을 μ‹œλ„ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œλŠ” 두 API의 응닡을 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ μ˜¬λ°”λ₯Έ 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

감사.

@ c0b41 , μ—…λ°μ΄νŠΈ 된 μ§ˆλ¬Έμ„ ν™•μΈν•˜μ‹­μ‹œμ˜€.

μ•ˆλ…•ν•˜μ„Έμš” @ c0b41 , 이것은 두 번째 axios ν˜ΈμΆœμ—μ„œ ꡬ문 였λ₯˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

@ aayushis12 , @ c0b41 : 이것은 도움말 포럼이 μ•„λ‹Œ 버그 μΆ”μ κΈ°μž…λ‹ˆλ‹€. Stack Overflow λ˜λŠ” Reactifluxμ—μ„œμ΄ μ§ˆλ¬Έμ„ν•΄μ•Όν•©λ‹ˆλ‹€. 더 λ§Žμ€ μ‚¬λžŒλ“€μ΄ μ§ˆλ¬Έμ„λ³΄κ³  λ„μšΈ μˆ˜μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

그것을 κ²½ν—˜ν•˜λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄

λ‚˜λŠ” λͺ¨λ“  κ²ƒμ„ν–ˆλ‹€

λͺ¨λ“  비동기 호좜이 ν•΄κ²°λ˜κΈ° 전에 μΈμ‡„λ©λ‹ˆλ‹€. 비동기 μž‘μ—… μƒμ„±μžλ‘œλΆ€ν„° λ¬Έμ΄λ‚˜ ν‘œν˜„μ‹μ„ λ°˜ν™˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ doSomethingElse() κ°€ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ {}둜 μ„ μ–Έ 된 경우

function doSomethingElse() {
  return dispatch => {
    fetch(
      '/api/something'
    ).then(
      response => response.json()
    ).then(
      json => dispatch({ type: DO_SOMETHING_ELSE, json }),
      err => dispatch({ type: SOMETHING_ELSE_FAILED, err })
    );
  }
}

doSomethingElse() ν•΄κ²°λ˜κΈ° 전에 "I did everything"이 μΈμ‡„λ©λ‹ˆλ‹€. => 뒀에 {}을 μ‚­μ œν•˜μ—¬μ΄ 문제λ₯Ό ν•΄κ²°ν•˜μ„Έμš”.

@gaearon ν•˜λ‚˜μ˜ 질문, https://github.com/reduxjs/redux/issues/723#issuecomment -139927639에 따라 두 개의 μž‘μ—…μ΄ 전달 될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” μž‘μ—…μ„ μ „λ‹¬ν•΄μ•Όν•˜λŠ” 경우 μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒμš” _AND_ μƒνƒœ κ·Έ 행동 λ•Œλ¬Έμ— λ³€ν•œ κ±΄κ°€μš”? μž‘μ—…μ΄ λ°œμ†‘λ˜μ—ˆμ§€λ§Œ then λ‚΄λΆ€μ˜ μž‘μ—…μ΄ _before_ μƒνƒœκ°€ λ³€κ²½λ˜κΈ° 전에 μ‹€ν–‰λ˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. redux-thunk μžˆμŠ΅λ‹ˆλ‹€.

@enmanuelduran : λŒ„μ€ 더 이상 적극적인 κ΄€λ¦¬μžκ°€ μ•„λ‹™λ‹ˆλ‹€. 제발 κ·Έλ₯Ό ν•‘ν•˜μ§€ λ§ˆμ„Έμš”.

μ½”λ“œλ₯Ό 보지 μ•Šκ³  μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ°λŠ” μ–΄λ ΅μ§€λ§Œ 우리의 λ¬Έμ œλŠ” μ‹€μ œλ‘œ ν† λ‘  포럼이 μ•„λ‹™λ‹ˆλ‹€. Stack Overflow에 μ§ˆλ¬Έμ„ κ²Œμ‹œν•˜λ©΄ 더 쒋을 κ²ƒμž…λ‹ˆλ‹€. 더 λ‚˜μ€ 닡변을 더 빨리 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

@markerikson 였, μ£„μ†‘ν•©λ‹ˆλ‹€. λ‚΄ μ˜λ„κ°€ μ•„λ‹ˆ μ—ˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€ 관심이 μžˆλ‹€λ©΄ stackoverflow에 μ§ˆλ¬Έμ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. https://stackoverflow.com/questions/51846612/dispatch-an-action-after-other-specific-actions-were- 파견 및 μƒνƒœ λ³€κ²½

λ§Žμ€ μ‚¬λžŒλ“€μ—κ²Œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰