λ°μ κ΅¬μ± μμλ₯Ό μμν λ λ κ°μ§ λΉλκΈ° http νΈμΆμ λ§λ€κ³ κ²°κ³Όλ₯Ό κΈ°λ€λ €μΌν©λλ€.
μ΄ λ νΈμΆμ μ΄μμ μΌλ‘ λ°μ΄ν°λ₯Ό λ κ°μ λ€λ₯Έ κ°μκΈ°μ λ£μ΅λλ€.
λ¨μΌ λΉλκΈ° νΈμΆ ν¨ν΄μ μ΄ν΄ν©λλ€.
κ·Έλ¬λ μ¬λ¬ λΉλκΈ° νΈμΆμ μννκ³ λ³λ ¬λ‘ μ€ννκ³ κ²°κ³Όκ° λμ°©ν λκΉμ§ _both_ κΈ°λ€λ¦¬κΈ°μν μ’μ μνμ λ³Ό μ μμ΅λλ€.
μ΄ μμ μ μννλ redux λ°©λ²μ 무μμ λκΉ?
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 :)
μνλ κ²½μ° 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- ν견 λ° μν λ³κ²½
λ§μ μ¬λλ€μκ² κ°μ¬ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
Redux Thunk λ―Έλ€μ¨μ΄λ₯Ό μ¬μ©νλ€κ³ κ°μ ν©λλ€.
μ‘μ μ μμλ₯Ό μ μΈν©λλ€.
μ½ν¬ μ‘μ μμ±μ λ΄λΆμμ ν¨μμ λ°ν κ°μΌλ‘ 체μΈμ μ μ§νμ¬ λ§¨ λμ
Promise
λ₯Ό λ°ννλ λ°©λ²μ μ£Όλͺ©νμμμ€. μ΄λ κ²νλ©΄ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.Redux Thunkλ₯Ό μ¬μ©νλ κ²½μ°
dispatch
λ μ½ν¬ μμ μμ±μ (μ΄ κ²½μ° Promise)μμ λ°ν ν ν¨μμ λ°ν κ°μ λ°νν©λλ€.μ΄λ κ²νλ©΄
Promise.all()
μ κ°μ μ‘°ν©μλ₯Ό μ¬μ©νμ¬ μ¬λ¬ μμ μ΄ μλ£ λ λκΉμ§ κΈ°λ€λ¦΄ μ μμ΅λλ€.κ·Έλ¬λ μ΄μ μ‘μ μ μμμ _composition_ μν μ ν λ€λ₯Έ μ‘μ μ μμλ₯Ό μ μνκ³ λ΄λΆμ μΌλ‘
Promise.all
μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.μ΄μ κ·Έλ₯ μΈ μ μμ΅λλ€
ν볡ν ν견!