ããã«ã¡ã¯ãç§ã¯Reduxãå匷ããŠããŠãèå³æ·±ãåé¡ã«çŽé¢ããŠããŸããïŒ ä»ã®ã¢ã¯ã·ã§ã³ããã®éåæãªã¯ãšã¹ãã®ãã§ãŒã³ãäœæããå¿
èŠããããŸã
1-getUserïŒïŒ
2-getPostïŒïŒ
ãµã€ã³ã€ã³ãŠãŒã¶ãŒ.thenïŒdispatchïŒ{typeïŒGET_POST_REQUEST}ïŒïŒã®åŸã«2ã€ã®ãœãªã¥ãŒã·ã§ã³ãå®è¡ããŸã
ãŸãã¯ããã«ãŠã§ã¢ã§é¢æ°ãèšè¿°ããŸãã
æ£ããè¡ãã«ã¯ã©ãããã°ããã§ããïŒ
ããïŒ ããã¯åé¡è¿œè·¡ã·ã¹ãã ã§ããããµããŒããã©ãŒã©ã ã§ã¯ãããŸããã SOãšã¯ç°ãªããããã§ã®åçã¯å€±ãããããã次åã¯StackOverflowã§è³ªåããŠããã ããã°å¹žãã§ãã
ããã¯èšã£ãŠãã Redux Thunkããã«ãŠã§ã¢ã䜿çšããŠã¹ãã¢ãäœæããå Žåã¯ã次ã®ãããªéåæã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãäœæã§ããŸãã
// If you use Redux Thunk...
import { createStore, applyMiddleware } from 'redux'
import thunk from 'redux-thunk'
const store = createStore(reducer, applyMiddleware(thunk))
// You can define asynchronous action creators that return functions.
// We call such action creators "thunks":
export function getUser(id) {
// Redux Thunk will inject dispatch here:
return dispatch => {
// Reducers may handle this to set a flag like isFetching
dispatch({ type: 'GET_USER_REQUEST', id })
// Perform the actual API call
return fetchUser().then(
response => {
// Reducers may handle this to show the data and reset isFetching
dispatch({ type: 'GET_USER_SUCCESS', id, response })
},
error => {
// Reducers may handle this to reset isFetching
dispatch({ type: 'GET_USER_FAILURE', id, error })
// Rethrow so returned Promise is rejected
throw error
}
)
}
}
// Thunks can be dispatched, if Redux Thunk is applied,
// just like normal action creators:
store.dispatch(getUser(42));
// The return value of dispatch() when you dispatch a thunk *is*
// the return value of the inner function. This is why it's useful
// to return a Promise (even though it is not strictly necessary):
store.dispatch(getUser(42)).then(() =>
console.log('Fetched user and updated UI!')
)
// Here is another thunk action creator.
// It works exactly the same way.
export function getPost(id) {
return dispatch => {
dispatch({ type: 'GET_POST_REQUEST', id })
return fetchPost().then(
response => dispatch({ type: 'GET_POST_SUCCESS', id, response }),
error => {
dispatch({ type: 'GET_POST_FAILURE', id, error })
throw error
}
)
}
}
// Now we can combine them
export function getUserAndTheirFirstPost(userId) {
// Again, Redux Thunk will inject dispatch here.
// It also injects a second argument called getState() that lets us read the current state.
return (dispatch, getState) => {
// Remember I told you dispatch() can now handle thunks?
return dispatch(getUser(userId)).then(() => {
// Assuming this is where the fetched user got stored
const fetchedUser = getState().usersById[userId]
// Assuming it has a "postIDs" field:
const firstPostID = fetchedUser.postIDs[0]
// And we can dispatch() another thunk now!
return dispatch(getPost(firstPostID))
})
}
}
// And we can now wait for the combined thunk:
store.dispatch(getUserAndTheirFirstPost(43)).then(() => {
console.log('fetched a user and their first post')
})
// We can do this anywhere we have access to dispatch().
// For example, we can use this.props.dispatch, or put action
// creators right into the props by passing them to connect, like this:
// export default connect(mapStateToProps, { getUserAndTheirFirstPost })
ãããFAQã«å ¥ããå¿ èŠããããŸãã
ç§ã¯ãã®åé¡ã次ã®ããã«è§£æ±ºããŸããã å€æŽã¢ã¯ã·ã§ã³ãªãã ã³ã³ããŒãã³ãPromiseãå ¥ããŸããã
clickShowUserEvent(data) {
Promise.resolve(data.userAuth(data.login, data.password)) // dispatch
.then(function (response) {
data.showEvents(); //dispatch
return response;
})
.then(function(response){console.log("@RESPONSE",response);data.show(data)})
}
ããã¯æ£ãã決å®ã§ããïŒ
ãããæ©èœããŸããã©ã®ãã¿ãŒã³ã䜿çšãããã¯ããªã次第ã§ãã
@ ar53n Reactã³ã³ããŒãã³ãã«promiseããããã¿ãŒã³ã«ã¯ãããã€ãã®æ¬ é¥ããããŸãã
catch
ã®éšåã§ãã æªåŠçã®æåŠãçºçããå¯èœæ§ããããŸãã@sompylasarããããšããžã§ã³ã³ã¡ã³ãããããšãããããŸãã åçŽãªã¢ã¯ã·ã§ã³ãå€æŽããããªãã ãã§ãã 2ã€ã®åçŽãªã¢ã¯ã·ã§ã³Authentication
ãšGetEvents
ããããŸããããã¯2ã€ã®éåæèŠæ±ã§ããã catch
ãå«ãŸããŠããŸãã ã³ã³ããŒãã³ããã¯ãªãã¯ãããšããã®ã¢ã¯ã·ã§ã³ãåŒã³åºãããŸã
äŸãã°
export function userAuth(login, password) {
return (dispatch, getState) => {
console.log('STATE', getState())
let newState = dispatch(requestUserAuth(login, password))
return fetch(AUTH_URL + newState.queryParams, MY_INIT)
.then(response => response.json())
.then(function (json) { dispatch(receiveUserAuth(json)); return json})
.catch(error => dispatch(errorUserAuth(error)))
}
}
ãããŠãç§ãã¡ã¯ãããæã£ãŠããŸã
Сç§ãééã£ãŠããå Žåã¯ç§ãèšæ£ããŠãã ãããããããšã
@ ar53nããã§åé¡ã¯ãªãããšã©ãŒãåŠçãããã¹ãã¢ã§ããã»ã¹ã远跡ãããŸãã ã³ã³ããŒãã³ãã§ã®äžæã®ãªãããã»ã¹ã®åé¡ã¯åŒãç¶ãåœãŠã¯ãŸããŸãããã³ã³ããŒãã³ããŸãã¯ã¢ã¯ã·ã§ã³ãµã³ã¯ã§éå§ããå Žåã¯ãããããããã»ã©éèŠã§ã¯ãããŸããã
@ar53nredux -dataloaderãã芧ãã ããã
è€éãªãã§ãŒã³éåæã¢ã¯ã·ã§ã³çšã«èšèšãããŠããŸãã
ããã圹ã«ç«ãŠã°å¹žãïŒ
ããã«ããã€ãã®å¯èœãªè§£æ±ºçãæ²èŒãããŠããã®ã§ããããç· ãããããŸãã æè¿ã§ã¯ãredux-sagaã調ã¹ãŠã¿ãŠãã ããã
@gaearonããªãã®äŸã®äŒæ©æéæ è¡ã¯ããã§ã¯ãããŸãããïŒ
ããšãã°ãAJAXåŒã³åºããæåã«å€±æããåŸããµãŒããŒåŽãä¿®æ£ããŠããçŽããããšããããšã§ãã
@gaearonç§ã¯ããªãã®è§£æ±ºçãè©ŠããŸããããä»»æã®ã³ã³ããŒãã³ãããïŒç§ã®å Žåã¯LoginComponentããæ¿èªèŠæ±ãè¡ãããã«ïŒ store.dispatch(...)
ãåŒã³åºãããšãããšã次ã®ãšã©ãŒãçºçããŸããïŒ
undefined is not an object (evaluating '_AppNavigator.AppNavigator.router')
äœããããããããã§ãã ç§ã¯æ¬¡ã®ãããªã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãèšå®ããŸããïŒ
// actions.tsx
export const ActionCreators = {
authenticate: (username: string, password: string) => {
return (dispatch) => {
return auth.login(username, password).then(
response => {
dispatch(navActionCreators.login(res))
return response
},
error => {
throw error
}
)
}
}
}
// LoginScreen.tsx (login method)
store.dispatch(authActions.authenticate(this.state.username, this.state.password))
.then((res) => {
this.setState({isLoading: false})
})
.catch((error: Error) => {
this.setState({
isLoading: false,
error: error ? error.message : 'Si Ú verificato un\' errore.'
})
})
ç§ã¯äœãæ¬ ããŠããŸããïŒ
@ bm-softwareïŒãã®è³ªåã¯ã代ããã«StackOverflowã§è¡ãå¿ èŠããããŸãã
@ ar53nãš@sompylasarã¯ä¹
ãã¶ãã§ãããä»ã¯ãã®ãã¿ãŒã³ã«èŠåŽããŠããŸãã ããªãã®äŸã®@ar53nã§ã$ïŒ$ 1 fetch
userAuth
ã倱æããå Žåã userAuth
ãåŒã³åºããããã§ãŒã³ã§äœãèµ·ãããŸããïŒ
.catch(error => dispatch(errorUserAuth(error)))
ãerrerUserAuthã¢ã¯ã·ã§ã³ããã£ã¹ãããããããã«èŠããŸããããã¯ãã°ãããããšã§ãã Reduxã§ã¯ãããã¯éåžžããšã©ãŒããåŠçãããæ¹æ³ã§ãã ããããããªããå
ã«è¿°ã¹ããã§ãŒã³ã§ã¯ïŒ
clickShowUserEvent(data) {
Promise.resolve(data.userAuth(data.login, data.password)) // dispatch
.then(function (response) {
data.showEvents(); //dispatch
return response;
})
.then(function(response){console.log("@RESPONSE",response);data.show(data)})
}
data.showEvents()
ã¯ããŠãŒã¶ãŒèªèšŒã倱æããå Žåã§ããåžžã«åŒã³åºãããŸãã ã»ãšãã©ã®äººãæåŸ
ãããæãã§ããããšã§ã¯ãªããšæããŸãããReduxã®ãšã©ãŒåŠçã¯éåžžãåã¹ããŒã§ã¯ãªããã£ã¹ãããã«ãã£ãŠè¡ãããããããšã©ãŒã飲ã¿èŸŒãã§ãpromiseãã§ãŒã³ãæåŸ
ã©ããã«æ©èœããŸããã
ãŸããåã¹ããŒãè¡ããšã_ã¢ããªå
ã®ãã¹ãŠã®ã·ã³ã°ã«ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®åŒã³åºãã§ãã©ãã§ã.catch()
ãå®è¡ããå¿
èŠããªããªããŸãã äžèšã®@gaearonã®äŸã§ã¯ããã¹ãŠã®ãšã©ãŒãåã¹ããŒããæåŸã«ãããå®è¡ããŸãã
// And we can now wait for the combined thunk:
store.dispatch(getUserAndTheirFirstPost(43)).then(() => {
console.log('fetched a user and their first post')
})
getUserAndTheirFirstPost
å
ã®å€§ããªçµåãã§ãŒã³ã®_anything_ã倱æããå ŽåããæªåŠçã®çŽæã®æåŠããšã©ãŒãçºçããŸãã
å¯äžã®çãã¯ãåã¹ããŒããŠããã©ãã§ã.catch()
ã䜿çšããããReact16ã®ãšã©ãŒå¢çã䜿çšããããšã ãšæããŸãã
@jasonrhodes
clickShowUserEvent(data) {
Promise.resolve(data.userAuth(data.login, data.password)) // dispatch
.then(function (response) {
data.showEvents(); //dispatch
data.showEvents()
ã¯ããŠãŒã¶ãŒèªèšŒã倱æããå Žåã§ããåžžã«åŒã³åºãããŸãã
ãããã data.userAuth(data.login, data.password)
ãçŽæãè¿ããæçµçã«æåŠãããå Žåã¯åŒã³åºãããŸããã .then
ã®æåã®åŒæ°ã¯ãçŽæãå±¥è¡ããããšãã«åŒã³åºããïŒ onFulfilled
ãšåŒã°ããŸãïŒã2çªç®ã®åŒæ°ã¯çŽæãæåŠããããšãã«åŒã³åºãããŸãïŒ onRejected
ãšåŒã°ããŸãïŒâä»æ§ãåç
§ããŠãã ããã
äžæ¹ãReact 16ã®ãšã©ãŒå¢çã¯ãPromiseã«ã¯åœ¹ç«ã¡ãŸãããåæçã«ã¹ããŒãããäŸå€ããã£ããããã ãã§ãReactã®å éšç¶æ ãå£ããªãããã«ããŸãã
@jasonrhodesãŸããPromiseã®äžçã®è¯ãåžæ°ã§ãããçŽæãçºä¿¡è
ã«è¿ããïŒãšã©ãŒãåŠçããå¿
èŠããããŸãïŒãããã«.catch
ãæ·»ä»ããŸãïŒãããŠãçŽæãäœæãããå Žæã§ãšã©ãŒãåŠçããŸãïŒã
ããªãã®äŸã¯äœãããŸããïŒ
clickShowUserEvent(data) {
Promise.resolve(data.userAuth(data.login, data.password)) // dispatch
.then(function (response) {
data.showEvents(); //dispatch
return response;
})
.then(function(response){console.log("@RESPONSE",response);data.show(data)})
}
@sompylasarããã¯ç§ã®äŸã§ã¯ãããŸããã§ãããããã¯ããªãããã®ã¹ã¬ããã®ååã§å¿çããŠãããã®ã§ããã ä¹ ãã¶ãã§ãããã°ãŒã°ã«æ€çŽ¢ã§ãã®ã¹ã¬ããã«äœåºŠãåºããããã®ã§ãããã§ä»¥åã®äŒè©±ãåèã«ããŠããŸããã
ããäžåºŠèŠãŠãã ããã userAuth
fetch
åŒã³åºãã倱æããå Žåã§ãã data.showEvents()
ã¯_åžžã«_åŒã³åºãããŸãã ãªãã§ïŒ userAuth
.catch()
ããããããReduxã®æ¹æ³ã§ãšã©ãŒãåŠçããŸãããšã©ãŒã¢ã¯ã·ã§ã³ããã£ã¹ãããããŸãã
ãããç§ã®æçš¿ã®ãã€ã³ãã§ããéåæã¢ã¯ã·ã§ã³ãããšã©ãŒããã£ããããŠãšã©ãŒã¢ã¯ã·ã§ã³ããã£ã¹ãããã§ããããã«ãããšãããã以äžã®promiseãã§ãŒã³ãæ£ããæ©èœããªãããã«é£²ã¿èŸŒãã§ããŸããŸããïŒ ãŸãã¯ããæªåŠçã®çŽæã®æåŠããåé¿ããããã«ããã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ãã¹ãŠã®åŒã³åºãå
ãåã¹ããŒããŠã .catch()
ã«åŒ·å¶ããŸããïŒ
ãŸããç§ã®çµéšã§ã¯ãä»æ§ã«ãªã³ã¯ããåã«ã誰ããç¥ã£ãŠããããšãç解ããããšããå§ãããŸãã è¿ä¿¡ããããšãããããŸããç§ãæãäžããå€ãäŒè©±ã ãšæããŸãããèŠéããããã®ã§éèŠãªäŒè©±ã§ãã
@jasonrhodes
@sompylasarããã¯ç§ã®äŸã§ã¯ãããŸããã§ãããããã¯ããªãããã®ã¹ã¬ããã®ååã§å¿çããŠãããã®ã§ããã ä¹ ãã¶ãã§ãããã°ãŒã°ã«æ€çŽ¢ã§ãã®ã¹ã¬ããã«äœåºŠãåºããããã®ã§ãããã§ä»¥åã®äŒè©±ãåèã«ããŠããŸããã
äºè§£ããŸãããç³ãèš³ãããŸããããã³ã³ããã¹ãå šäœãæãåºããŸããã§ããã
userAuth
.catch()
ããããããReduxã®æ¹æ³ã§ãšã©ãŒãåŠçããŸãããšã©ãŒã¢ã¯ã·ã§ã³ããã£ã¹ãããããŸãã
äºè§£ããŸãããããã¯æå³ãããšããã«æ©èœãããããã®çŽæãè¿ãå ŽåïŒããã³åŒã³åºããµã€ãã§ãšã©ãŒãåŠçããå ŽåïŒã«.catch
ãããã«çœ®ãã¹ãã§ã¯ãªããã .catch
å
ã§ãšã©ãŒãåã¹ããŒããå¿
èŠããããŸããããŠã³ã¹ããªãŒã promiseãæåŠãã
ãšã«ããããµã³ã¯èªäœã¯é£éã«ã¯ããŸãé©ããŠããŸããã ãµã³ã¯å ã§ãã§ãŒã³ããããããè€éãªéåæã¯ãŒã¯ãããŒã«ã¯sagasã䜿çšããå¿ èŠããããŸãã
ç§ã¯ãã°ããã®éãçŽæã®é£éãæã¡åããšãããã®åé¡ã«æ©ãŸãããŠããŸããã éåžžãç§ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ããµã³ã¯ããè¿ãããåãhttpãªã¯ãšã¹ãã®.thenïŒïŒã§SUCCESSã¢ã¯ã·ã§ã³ãçºè¡ãããã.catchïŒïŒã§FAILUREã¢ã¯ã·ã§ã³ãçºè¡ããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãcatchãããã¯ã«ç§»åãã this.props.myActionCreator().then(() => )
ãå®è¡ãããšããªã¯ãšã¹ãã«åé¡ããã£ããšããŠããthenå
ã®ã³ãŒããå®è¡ãããŸãã
ããã説æããããã«ãç§ã¯åžžã«ããã®ã¢ã¯ã·ã§ã³äœæè ã®FAILUREã±ãŒã¹ã§èšå®ãããã¢ããªç¶æ ã®ãšã©ãŒå€æ°ããã§ãã¯ããããã«ããŸããã ããããè€æ°ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãç¹ã«ä»ã®ã¯ãªãšãŒã¿ãŒã«äŸåããŠããã¯ãªãšãŒã¿ãŒã«é»è©±ãããããšãäºæ ã¯åä»ã«ãªããŸãã å€ãã®ãšã©ãŒå€æ°ããã§ãã¯ããifã¹ããŒãã¡ã³ããå¿ èŠã§ããã
ã¢ã¯ã·ã§ã³äœæè ã®æ»ãå€ã®catchãããã¯ã§ãšã©ãŒãåã¹ããŒããããšã§ãpromiseãã§ãŒã³ãå£ããªããšããäºå®ãæ°ã«å ¥ã£ãŠããŸãã ãã ãããã®ããã«ã¯ãã¢ã¯ã·ã§ã³äœæè ãåŒã³åºãããReactã³ã³ããŒãã³ãã®.catchïŒïŒã䜿çšããå¿ èŠããããŸãã ãšã©ãŒå€æ°ã¯ã¬ãã¥ãŒãµãŒã§ã®FAILUREã¢ã¯ã·ã§ã³ã®åŠçã«ãã£ãŠãã§ã«èšå®ãããŠããããããã®catchãããã¯ã«ã¯äœãæžã蟌ãŸããŸããã
ã§ã¯ã @ jasonrhodes ã @ sompylasarã¯ãåã¹ããŒã¢ãããŒãã䜿çšããReactã³ã³ããŒãã³ãã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒåŒã³åºãã®promiseãã§ãŒã³ã«ç©ºã®.catchïŒïŒãããã¯ãé 眮ããããšããå§ãããŸããïŒ
@nbkhopeæ£çŽãªãšãããããã¯Reduxã§ã®ç§ã®æ倧ã®åé¡ã§ãããä»æ¥ãŸã§ç§ã¯è¯ãçããèŠã€ããŠããŸããã ãã以äžåœ¹ã«ç«ããªãããšããè©«ã³ããŸãïŒ
çããããã®èšäºã§ããã€ãã®ãµã³ã¯ã®ä»£æ¿æ¡ãèŠã€ããããšãã§ããŸãhttps://decembersoft.com/posts/what-is-the-right-way-to-do-asynchronous-operations-in-redux/
@gaearon
ããªãã®æåã®çãã«é¢ããŠãpromiseã®ä»£ããã«asyncïŒawaitã䜿çšããŠããå Žåãã©ã®ããã«å€æããã°ããã§ããïŒ æ¬¡ã®ãããªãã®ïŒ
export const funcA = () => {
return async (dispatch) => {
const data = await doSomething(...)
dispatch({ action: DID_SOMETHING, payload: data })
}
}
export const funcB = () => {
return async (dispatch) => {
const data = await doSomethingElse(...)
dispatch({ action: DID_SOMETHING_ELSE, payload: data })
}
}
export const funcC = () => {
return async (dispatch) => {
const data = await doSomethingMore(...)
dispatch({ action: DID_SOMETHING_MORE, payload: data })
}
}
// how to chain funcA, funcB and funcC
const myFunc = () => {
// execute funcA
// when complete execute funcB
// when complete execute funcC
}
@yingdongzhangããªãã¯ãããã次ã®ããã«é£éãããããšãã§ããŸãïŒ
const myFunc = () => {
return async (dispatch) => {
try {
await dispatch(funcA())
await dispatch(funcB())
await dispatch(funcC())
} catch (error) {
//error handling
}
}
}
@BoomxxæåŸ éãã«åäœããŠããã ãããããšãããããŸãã
fetch all posts of the user
ãã©ããã£ãŠããã®ãããã
@ km16 ïŒããã¯ãã°ãã©ãã«ãŒã§ããããµããŒãã·ã¹ãã ã§ã¯ãããŸããã 䜿çšæ³ã«é¢ãã質åã«ã€ããŠã¯ãStack OverflowãŸãã¯Reactifluxã䜿çšããŠãã ãããå€ãã®äººãããªããå©ããŠãããæºåãã§ããŠããŸãããããããããè¯ãçããããæ©ãåŸãããã§ãããã ããããšãïŒ
æãåèã«ãªãã³ã¡ã³ã
ããïŒ ããã¯åé¡è¿œè·¡ã·ã¹ãã ã§ããããµããŒããã©ãŒã©ã ã§ã¯ãããŸããã SOãšã¯ç°ãªããããã§ã®åçã¯å€±ãããããã次åã¯StackOverflowã§è³ªåããŠããã ããã°å¹žãã§ãã
ããã¯èšã£ãŠãã Redux Thunkããã«ãŠã§ã¢ã䜿çšããŠã¹ãã¢ãäœæããå Žåã¯ã次ã®ãããªéåæã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãäœæã§ããŸãã
ãããFAQã«å ¥ããå¿ èŠããããŸãã