Redux: рдПрд╕рд┐рдВрдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: reduxjs/redux

рд╣реИрд▓реЛ, рдореИрдВ Redux рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ? рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
1-рдЧреЗрдЯ рдпреВрдЬрд╝рд░ ()
2-рдЧреЗрдЯрдкреЛрд╕реНрдЯ ()

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рдкрд╛рд╕ 2 рд╕рдорд╛рдзрд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реИрдВред рддрдм (рдкреНрд░реЗрд╖рдг ({рдкреНрд░рдХрд╛рд░: GET_POST_REQUEST}))
рдпрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВред

рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ! рдпрд╣ рдПрдХ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рд╣реИ рди рдХрд┐ рд╕рдкреЛрд░реНрдЯ рдлреЛрд░рдоред рд╣рдо рдЕрдЧрд▓реА рдмрд╛рд░ StackOverflow рдкрд░ рдкреВрдЫрдиреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ SO рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдБ рдЙрддреНрддрд░ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ рдЖрдк Redux Thunk рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрдЯреЛрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ async рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

// 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 })

рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рдбрд╛рд▓ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирдорд╕реНрддреЗ! рдпрд╣ рдПрдХ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рд╣реИ рди рдХрд┐ рд╕рдкреЛрд░реНрдЯ рдлреЛрд░рдоред рд╣рдо рдЕрдЧрд▓реА рдмрд╛рд░ StackOverflow рдкрд░ рдкреВрдЫрдиреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ SO рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдБ рдЙрддреНрддрд░ рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ рдЖрдк Redux Thunk рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╕реНрдЯреЛрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ async рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

// 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 })

рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рдбрд╛рд▓ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рд▓ рдХрд┐рдпрд╛ред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ред рдореИрдВ рдШрдЯрдХ рд╡рд╛рджрд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред

  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 рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдореЗрдВ рдПрдХ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдкреИрдЯрд░реНрди рдореЗрдВ рдХрдИ рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВ:

  • рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рд╣реИ ( рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ), рдпрд╛рдиреА catch рднрд╛рдЧред рдЖрдкрдХреЛ рдЕрдирд╣реЗрд▓реНрдб рд░рд┐рдЬреЗрдХреНрд╢рди рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
  • рдпрд╣ рдЕрдмрд╛рдзрд┐рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдШрдЯрдХ рдЕрдирдорд╛рдЙрдВрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдРрдк рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИред
  • рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд╣рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдПрдХ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдРрдк рд╕реНрдЯреЗрдЯ рдореЗрдВ рдЙрд╕ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

@sompylasar рдзрдиреНрдпрд╡рд╛рдж рдЬреЙрди рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╕рд┐рд░реНрдл рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ Authentication рдФрд░ GetEvents рдпрд╣ 2 async рдЕрдиреБрд░реЛрдз рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ 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)))
  }
}

рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ
image

рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдБ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЛ, рдзрдиреНрдпрд╡рд╛рдж

@ ar53n рдлрд┐рд░ рдЖрдк рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдореЗрдВ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдШрдЯрдХ рдореЗрдВ рдЕрдмрд╛рдзрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рдЙрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рдШрдЯрдХ рдпрд╛ рдПрдХреНрд╢рди рдердВрдХ рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред

@ ar53n рдЖрдк redux-dataloader рдкрд░ рднреА рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЬрдЯрд┐рд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ async рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛!

рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЖрдк рдЖрдЬрдХрд▓ redux-saga рдореЗрдВ рднреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ!

@gaearon рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмреНрд░реЗрдХ рдЯрд╛рдЗрдо рдЯреНрд░реИрд╡рд▓рд┐рдВрдЧ рд╣реИ рдирд╛?

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ AJAX рдХреЙрд▓ рдкрд╣рд▓реА рдмрд╛рд░ рд╡рд┐рдлрд▓ рд╣реБрдЖ рдФрд░ рдлрд┐рд░ рдЖрдк рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл рдареАрдХ рд╣реЛ рдЧрдП рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

@gaearon рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рд╕реЗ store.dispatch(...) рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ LoginComponent рд╕реЗ рдЕрдзрд┐рдХреГрдд рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

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.'
     })
   })

рдореИрдВ рдХреНрдпрд╛ рдЦреЛ рд░рд╣рд╛ рд╣реВрдБ?

@ рдмреАрдПрдо-рд╕реЙрдлреНрдЯрд╡реЗрдпрд░: рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдкреВрдЫрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ ar53n рдФрд░ @ sompylasar рдореБрдЭреЗ рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рдЗрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВред @ ar53n рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ fetch рдЕрдВрджрд░ userAuth рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ userAuth рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .catch(error => dispatch(errorUserAuth(error))) рдЧрд▓рддреА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ UserAuth рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред 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() рдХреЛ _always_ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгрди рд╡рд┐рдлрд▓ рд╣реЛред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдпрд╣реА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ Redux рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЖрдорддреМрд░ рдкрд░ рдбрд┐рд╕реНрдкреИрдЪрд┐рдВрдЧ рдФрд░ рд░реА-рдереНрд░реЛ рдирд╣реАрдВ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдЧрд▓ рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдкреНрд░реЙрдорд┐рд╕ рдЪреЗрдирд┐рдВрдЧ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рди рдХрд░реЗред

рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдЖрдк рд░реА-рдереНрд░реЛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ _рдЖрдкрдХреЗ рдРрдк рдореЗрдВ рд╣рд░ рдПрдХ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЙрд▓, рд╣рд░ рдЬрдЧрд╣_ рдкрд░ .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() рд╣рд░ рдЬрдЧрд╣, рдпрд╛ рд╕рдВрднрд╡рддрдГ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16 рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

@jasonrhodes

clickShowUserEvent(data) {
   Promise.resolve(data.userAuth(data.login, data.password)) // dispatch
    .then(function (response) {
      data.showEvents(); //dispatch

data.showEvents() рдХреЛ _always_ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПред

рдирд╣реАрдВ, рдпрджрд┐ data.userAuth(data.login, data.password) рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрддрдГ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рджрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ .then рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ onFulfilled рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рджреВрд╕рд░рд╛ рдЬрдм рд╡рд╛рджрд╛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ onRejected рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) - рдХрд▓реНрдкрдирд╛ рджреЗрдЦреЗрдВ .

рджреВрд╕рд░реЗ рдиреЛрдЯ рдкрд░, рд░рд┐рдПрдХреНрдЯ 16 рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рдПрдВ рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА, рд╡реЗ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИрдВ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдЯреВрдЯреА рдирд╣реАрдВ рд╣реИред

@jasonrhodes рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╛рджрд╛ рджреБрдирд┐рдпрд╛ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдирд╛рдЧрд░рд┐рдХ рдмрдиреЗрдВ, рдпрд╛ рддреЛ рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ (рдЗрд╕реЗ рддрдм рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛) рдпрд╛ рдЗрд╕реЗ .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 рдпрд╣ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдерд╛, рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рдереЗред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ Google рдЦреЛрдЬреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрдпрд╛ рд╣реВрдВред

рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ, data.showEvents() рдХреЛ _always_ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА userAuth рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ fetch рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПред рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ .catch() рдХреЗ рдЕрдВрджрд░ userAuth рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ Redux рддрд░реАрдХреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ: рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрдХрд░ред

рдпрд╣ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ: рдЬрдм рдЖрдк рдПрд╕рд┐рдВрдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рднреЗрдЬ рд╕рдХреЗрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдирд┐рдЧрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдХреЗ рд╡рд╛рджреЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВ? рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рд░ рдХреЛ .catch() рдкрд░ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ "рдЕрдирд╣реЗрд▓реНрдб рдкреНрд░реЙрдорд┐рд╕ рд░рд┐рдЬреЗрдХреНрд╢рди" рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рд╕рд╛рде рд╣реА, рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХрд┐рд╕реА рдпреБрдХреНрддрд┐ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕рдордЭрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреНрдпрд╛ рдЬрд╛рдирддрд╛ рд╣реИред рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрд░рд╛рдиреА рдмрд╛рддрдЪреАрдд рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЦреЛрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ!

@jasonrhodes

@sompylasar рдпрд╣ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдерд╛, рдпрд╣ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рдереЗред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ Google рдЦреЛрдЬреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрдпрд╛ рд╣реВрдВред

рд╕рдордЭ рдЧрдпрд╛, рдореИрдВ рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ, рдореБрдЭреЗ рдкреВрд░рд╛ рдкреНрд░рд╕рдВрдЧ рдпрд╛рдж рдирд╣реАрдВ рдЖрдпрд╛ред

рдХреНрдпреЛрдВрдХрд┐ .catch() рдХреЗ рдЕрдВрджрд░ userAuth рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ Redux рддрд░реАрдХреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ: рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрдХрд░ред

рд╕рдордЭ рдЧрдпрд╛, рдпрд╛ рддреЛ рдпрд╣ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдк рдЙрд╕ рд╡рд╛рджреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдХреЙрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ), рдпрд╛ рдЖрдкрдХреЛ .catch рдХреЗ рднреАрддрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ .catch рдирд╣реАрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред .catch рд╣реИрдВрдбрд▓рд░ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рд╡рд╛рджреЗ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рд╡реИрд╕реЗ рднреА, рдердВрдХреНрд╕ рд╕реНрд╡рдпрдВ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдкрдХреЛ рдПрдХ рдердВрдХ рдХреЗ рдЕрдВрджрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЧрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд╛рджреЗ рдХреА рдЬрдВрдЬреАрд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВред рдЖрдорддреМрд░ рдкрд░, рдореЗрд░реЗ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░реНрд╕ .then() рдореЗрдВ рдПрдХ SUCCESS рдПрдХреНрд╢рди рдпрд╛ рдЙрд╕реА http рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЗ .catch() рдореЗрдВ рдПрдХ FAILURE рдПрдХреНрд╢рди рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдердВрдХ рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рднреА рдореЗрд░рд╛ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рдЧрдпрд╛ рдФрд░ рдореИрдВрдиреЗ this.props.myActionCreator().then(() => ) рдХрд┐рдпрд╛, рддреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдкрд░ рднреА рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ред

рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдРрдк рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЪрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП FAILURE рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реЗрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдХрдИ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░реНрд╕ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЪреАрдЬреЗрдВ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рд╡реЗ рдЬреЛ рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдХрдИ рдПрд░рд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЪреЗрдХ рдХрд░рдирд╛ рдерд╛ред

рдореБрдЭреЗ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдХрд░ рд╡рд╛рджрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдиреЗ рдХрд╛ рддрдереНрдп рдкрд╕рдВрдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рд╕реЗ .catch() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд╕ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ reducer рдореЗрдВ FAILURE рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рддреЛ рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧ, @jasonrhodes , @sompylasar , рдореБрдЭреЗ рд░реА-рдереНрд░реЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдореЗрдВ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЙрд▓ рдХреА рд╡рд╛рджрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдПрдХ рдЦрд╛рд▓реА .catch () рдмреНрд▓реЙрдХ рд░рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрдВрдЧреЗ?

@nbkhope рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ Redux рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЖрдЬ рддрдХ рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрдХ рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ!

рджреЛрд╕реНрддреЛрдВ, рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреБрдЫ рдердВрдХ рд╡рд┐рдХрд▓реНрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ https://decembersoft.com/posts/what-is-the-right-way-to-do-asynchronous-operations-in-redux/

@gaearon

рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рдЙрддреНрддрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЕрдЧрд░ рдореИрдВ рд╡рд╛рджреЛрдВ рдХреЗ рдмрдЬрд╛рдп async рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ:

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 : рдпрд╣ рдПрдХ рдмрдЧ рдЯреНрд░реИрдХрд░ рд╣реИ, рд╕рдкреЛрд░реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВред рдЙрдкрдпреЛрдЧ рд╕рдВрдмрдВрдзреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдпрд╛ рд░рд┐рдПрдХреНрдЯрд┐рдлреНрд▓рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЛрдЧ рддреИрдпрд╛рд░ рд╣реИрдВ - рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдПрдХ рдмреЗрд╣рддрд░ рдЙрддреНрддрд░ рддреЗрдЬреА рд╕реЗ рдорд┐рд▓реЗрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕