Redux: рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда async рд╕рд░реНрд╡рд░рд╕рд╛рдЗрдб рд▓реЛрдбрд┐рдВрдЧ рддрдХрдиреАрдХ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬреВрди 2015  ┬╖  63рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: reduxjs/redux

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреИрдЯрд░реНрди рдкрд╕рдВрдж рд╣реИрдВред рдореИрдВ

рдореИрдВ рдПрдХ рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдРрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдбрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдЕрдм рддрдХ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдореБрдЭреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреГрд╖реНрда рд▓реЛрдб рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рд╕реНрдЯреЛрд░ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ (рд╕рд░реНрд╡рд░ рдкрд░) рдХреИрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ dispatch(userActions.load()) рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕реНрдЯреЛрд░ рдХреЛ рдирдпрд╛ рд░рд╛рдЬреНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛рдиреА return { ...state, loading: true }; ), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ред dispatch() рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдкрд╛рд╕ рдХреА рдЧрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП...

dispatch(someAsyncAction, successAction, failureAction) => Promise

...рдЬрд╣рд╛рдВ рд╡рд╛рджрд╛ рддрдм рддрдХ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдиреНрдп рджреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рднреЗрдЬ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ред

рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдзрд╛рд░ рд╕реЗ рджреВрд░ рд╣реВрдВ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ?

рдзрдиреНрдпрд╡рд╛рджред

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

// Middleware
export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, types, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    const [REQUEST, SUCCESS, FAILURE] = types;
    next({ ...rest, type: REQUEST });
    return promise.then(
      (result) => next({ ...rest, result, type: SUCCESS }),
      (error) => next({ ...rest, error, type: FAILURE })
    );
  };
}

// Usage
function doSomethingAsync(userId) {
  return {
    types: [SOMETHING_REQUEST, SOMETHING_SUCCESS, SOMETHING_FAILURE],
    promise: requestSomething(userId),
    userId
  };
}

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

рдзрдиреНрдпрд╡рд╛рдж!

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд▓реЛрдбрд┐рдВрдЧ рджреБрдХрд╛рдиреЛрдВ рдореЗрдВ рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

Redux рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреЛрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВред рдЖрдк рдЬреЛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ _рдерд┐рдВрдХ_ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдердВрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:

export function doSomethingAsync() {
  return (dispatch) => {
    dispatch({ type: SOMETHING_STARTED });

    return requestSomething().then(
      (result) =>  dispatch({ type: SOMETHING_COMPLETED, result }),
      (error) =>  dispatch({ type: SOMETHING_FAILED, error })
    );
  };
}

рдФрд░ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рджрд╛рдиреЗрджрд╛рд░) рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ред

рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓рд┐рдЦрдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред

рдкреНрд░рддрд┐рднрд╛рд╡рд╛рди! рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ _doing_ рдФрд░ _storing_ рдХрд╛ рд╡рд╣ рдЕрд▓рдЧрд╛рд╡ рдкрд╕рдВрдж рд╣реИред

рдореИрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдмрдврд╝рддреЗ рд╣реБрдП рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╣рдж рддрдХ рдкреВрд░реНрдг рд╣реИред рдЪреАрдпрд░реНрд╕, @gaearon!

рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    next({ ...rest, readyState: 'request' );
    return promise.then(
      (result) => next({ ...rest, result, readyState: 'success' }),
      (error) => next({ ...rest, error, readyState: 'failure' })
    );
  };
}

рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред

рдпрд╣ рдЖрдкрдХреЛ async рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЬреИрд╕реЗ рд▓рд┐рдЦрдиреЗ рджреЗрдЧрд╛

function doSomethingAsync(userId) {
  return {
    type: SOMETHING,
    promise: requestSomething(userId),
    userId
  };
}

рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдВ

{ type: SOMETHING, userId: 2, readyState: 'request' }
{ type: SOMETHING, userId: 2, readyState: 'success' }
{ type: SOMETHING, userId: 2, readyState: 'failure' }

рдУрд╣, рдпрд╣ рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдЬрдм рдореИрдВрдиреЗ рдореВрд▓ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛ рддреЛ рдореЗрд░реЗ рдорди рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдерд╛ред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рд╕реНрдЯреЛрд░ рдХреЗ рдЕрдВрджрд░ readyState рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП if s рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдЯреНрд░реЗрдбрдСрдлрд╝ рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ addtional рд╣реЛрдиреЗ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ _SUCCESS рдФрд░ _FAILURE рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕рд┐рд░реНрдл рдбрд╛рд▓рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ if рдПрдХ рдЕрдВрджрд░ case ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдзрдиреНрдпрд╡рд╛рджред

рд╣рд╛рдБ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЗ рд╕реНрд╡рд╛рдж рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ types: { request: ..., success: ..., failure: ... } рдХреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдиреЗ рдХреА рдмрд╛рдд рд╣реИ: рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИред

// Middleware
export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, types, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    const [REQUEST, SUCCESS, FAILURE] = types;
    next({ ...rest, type: REQUEST });
    return promise.then(
      (result) => next({ ...rest, result, type: SUCCESS }),
      (error) => next({ ...rest, error, type: FAILURE })
    );
  };
}

// Usage
function doSomethingAsync(userId) {
  return {
    types: [SOMETHING_REQUEST, SOMETHING_SUCCESS, SOMETHING_FAILURE],
    promise: requestSomething(userId),
    userId
  };
}

рдЕрд░реЗ рдпрд╛рд░, рдореБрдЭреЗ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рд╣реИред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд╣рд▓реЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ then() рдФрд░ dispatch() рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫрд╛ рд╣реИред рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рд╣реБрд░реНрд░реЗ!

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреИрд╕реЗ (рдФрд░ рдХреНрдпрд╛ ;-) рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЬреНрдпрд╛рджрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЖрдкрдиреЗ рдПрдХ } рдЫреЛрдбрд╝рд╛ (рд╡рд╣ -1 рдЕрдВрдХ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдкрд╣рд▓реА рдмрд╛рд░ред

:+1:

@erikras рдореИрдВ

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

app.get('/my-app', (req, res) => {
  Router.run(routes, req.path, (error, initialState) => {
    Promise.all(initialState.components
      .filter(component => component.fetchData) // only components with a static fetchData()
      .map(component => {
        // have each component dispatch load actions that return promises
        return component.fetchData(redux.dispatch);
      })) // Promise.all combines all the promises into one
      .then(() => {
        // now fetchData() has been run on every component in my route, and the
        // promises resolved, so we know the redux state is populated
        res.send(generatePage(redux));
      });
  });
});

рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреБрдЫ рд╕рд╛рдл рд╣реЛрддрд╛ рд╣реИ?

@ рд╕рдмрд╕реЗ

рд╕реНрд▓реИрдХ рдореЗрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

рдореЗрд░реЗ рдкрд╛рд╕ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реИ

 static async routerWillRun({dispatch}) {
   return await dispatch(UserActions.fooBar());
 }

рдЬрд╣рд╛рдВ UserActions.fooBar() рд╣реИ:

export function fooBar() {
 return dispatch => {
   doAsync().then(() => dispatch({type: FOO_BAR}));
 };
}

рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдореИрдВ рдЙрдкрдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

 yield myHandler.routerWillRun({dispatch: redux.dispatch});

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ fooBar рдХреА рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдзрд┐ рд╕реЗ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрд╛ рддреЛ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд╣рдЯрд╛ рджреЗрдВ:

export function fooBar() {
  return dispatch =>
    doAsync().then(() => dispatch({type: FOO_BAR}));
}

рдпрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ return рдХрдерди рдЬреЛрдбрд╝реЗрдВ:

export function fooBar() {
  return dispatch => {
    return doAsync().then(() => dispatch({type: FOO_BAR}));
  };
}

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╕реНрдЯрдо рд╡рд╛рджрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@erikras рдЖрдкрдХреА рдЖрдЦрд┐рд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк initialState.components (Router.run рдХреЗ рдХреЙрд▓рдмреИрдХ рдореЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ fetchData рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрдк рдШрдЯрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдЙрди рдШрдЯрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдореИрдВ рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

import React from 'react';
import Router from 'react-router';
import {Route, RouteHandler, DefaultRoute} from 'react-router';

//imagine Bar needs some data
const Bar = React.createClass({
  render(){
    return(
      <div>bar</div>);
  }
});

const Foo = React.createClass({
  render(){
    return (
      <div>
        foo
        <Bar/>
      </div>);
  }
});


const App = React.createClass({
  render(){
    return (
      <div>
        <RouteHandler />
      </div>
    );
  }
});

const routes = (
  <Route path="/" handler={App} name="App">
    <DefaultRoute handler={Foo} name="Foo"/>
  </Route>
);

Router.run(routes,'/',function(Root,state){
  console.log(state);
});

рдЖрдЙрдЯрдкреБрдЯ:

{ path: '/',
  action: null,
  pathname: '/',
  routes: 
   [ { name: 'App',
       path: '/',
       paramNames: [],
       ignoreScrollBehavior: false,
       isDefault: false,
       isNotFound: false,
       onEnter: undefined,
       onLeave: undefined,
       handler: [Object],
       defaultRoute: [Object],
       childRoutes: [Object] },
     { name: 'Foo',
       path: '/',
       paramNames: [],
       ignoreScrollBehavior: false,
       isDefault: true,
       isNotFound: false,
       onEnter: undefined,
       onLeave: undefined,
       handler: [Object] } ],
  params: {},
  query: {} }

рдЖрдкрдХреЗ рдкрд╛рд╕ рд░реВрдЯреНрд╕ рдореЗрдВ рдмрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА

@erikras рд╢рд╛рдирджрд╛рд░! рдареАрдХ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдореИрдВ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@iest рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдкрди рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛, рдорд┐рд▓рд╛рди рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдХреЗ "рдПрдХ рдорд╛рд░реНрдЧ рдиреАрдЪреЗ рдЬрд╛рдПрдВ"ред :-)

@mattybow рдпрд╣ рд╕рдЪ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ _really_ рдРрд╕реЗ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк React.renderToString() рдПрдХ рдмрд╛рд░ (рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, componentWillMount() рдореЗрдВ рдЕрдкрдиреА рд╕рднреА рд▓реЛрдбрд┐рдВрдЧ рдХрд░реЗрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╛рджреЛрдВ рдХреЛ рдмрдЪрд╛рдПрдВред react-router рд╕рдорд░реНрдерд┐рдд рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЕрдкрдиреЗ рдШрд░реЗрд▓реВ рд░реВрдЯрд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдпрд╣реА рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рд▓реЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдорд╛рд░реНрдЧ рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд▓рдХреНрд╖рдг рд╣реЛ рд╕рдХрддреА рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдорд╛рд░реНрдЧ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@erikras
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рдкрд░ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реЗрдкреЛ рд╣реИ?

@transedward рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рд╛рдордЧреНрд░реА рдЕрдм рддрдХ рдЬрд┐рд╕ рддрд░реАрдХреЗ рд╕реЗ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╡рд┐рд╕реНрддреГрдд рдХреА рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдкрд░рд┐рдкрдХреНрд╡ рд╣реИред рдорд╛рдлрд╝ рдХрд░рдирд╛ред

рдЙрдиреНрдирдд рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ +1
рдореБрдЭреЗ рдкреНрдпрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣рд╛ рд╣реИ!

@transedward рдпрд╣рд╛рдБ рдПрдХ рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдмреНрд▓реАрдбрд┐рдВрдЧ рдПрдЬ рдЯреЗрдХ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред https://github.com/erikras/react-redux-universal-hot-example/

@erikras рдпрд╣ рдХрдорд╛рд▓ рд╣реИ! рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рд░реАрдбрдореЗ рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╣реЙрдЯ рд▓реЛрдбрд░ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ "рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж! рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдПред

@erikras рдЧреНрд░реЗрдЯ - рдзрдиреНрдпрд╡рд╛рдж!

рдмрд╕ рдПрдХ рдиреЛрдЯ - рдЗрд╕ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░- рдореИрдВрдиреЗ рд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдпрд╛: https://github.com/pburtchaell/redux-promise-middlewareред

@pburtchaell @acdlite рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╣реИред https://github.com/acdlite/redux-promise

рдЗрд╕ рдкрд░ рджреЛ рд╡рд┐рдЪрд╛рд░:

  1. рд╡рд╛рджреЗ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ Redux Store рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдкреГрд╖реНрда рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдмрд╕ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рд╡рд╛рджреЗ рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рдкрд╛рд░рд┐рдд рд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдХреЛрдИ рд▓рдВрдмрд┐рдд рд╡рд╛рджреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд╛рджрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

  1. рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдиреБрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЙрд▓ рдХрд░рдиреЗ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рд╕рдВрджреЗрд╢ 3 рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рдХрдВрдЯреЗрдирд░ <Message id={3}> рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдВрджреЗрд╢ рдЪрдпрдирдХрд░реНрддрд╛ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ state.msgs[3] рдореМрдЬреВрдж рд╣реИ рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕рдВрджреЗрд╢ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рднреЗрдЬреЗрдВред

рддреЛ рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ рдФрд░ рдШрдЯрдХ рдЕрдкрдиреЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рддрдГ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡реЗ рдХрдм рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ "рд╕реНрдЯреЛрд░ рдпрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рди рдбрд╛рд▓реЗрдВ"ред рдпрд╣ рдЙрди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ (рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордп рдпрд╛рддреНрд░рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _very_ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдлрд┐рд░, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдкреГрд╖реНрда рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдмрд╕ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рд╡рд╛рджреЗ рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рдкрд╛рд░рд┐рдд рд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдХреЛрдИ рд▓рдВрдмрд┐рдд рд╡рд╛рджреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд╛рджрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрдд рдореЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рджреЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐, рдкреНрд░реЗрд╖рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХрдЪреНрдЪреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрдИ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдХреНрдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ "рдПрдХрддреНрд░рд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдРрдкреНрд╕ рдореЗрдВ Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ Redux рдореЗрдВ рдЙрди рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рджрд╛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдореНрдоред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @wmertens рдХреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдПрдХрд╛рдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдХреЙрд▓реЛрдВ рд╕реЗ рдмрдЪрдирд╛ (рдпрджрд┐ рдХреБрдЫ рд▓рдВрдмрд┐рдд рд╣реИ рддреЛ рдХреБрдЫ рднреА рди рдХрд░реЗрдВ) рдПрдХ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реЗ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдХреНрдпрд╛ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдШрдЯрдХ) рдХреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ .. рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ @connect рдПрдиреЛрдЯреЗрд╢рди рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд▓рдкреЗрдЯрддрд╛ рд╣реИ?

рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реЗ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрдпреЛрдВ? рдпрджрд┐ рдЖрдк рдердВрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

function doSomething() {
  return { type: 'SOMETHING' };
}

function maybeDoSomething() {
  return function (dispatch, getState) {
    if (getState().isFetching) {
      return;
    }

    dispatch(doSomething());
  };
}

store.dispatch(maybeDoSomething());

рдЬреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ!
рдореИрдВрдиреЗ рдПрдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ) рдХрд┐ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдореЗрдВ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рдерд╛ ^ ^ рдЪреВрдВрдХрд┐ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЙрд▓рд░ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рд╛рдБ рдХреВрд▓ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)

рдзрдиреНрдпрд╡рд╛рдж @gaearon

@gaearon , http://gaearon.github.io/redux/docs/api/applyMiddleware.html рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░:

рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    next({ ...rest, readyState: 'request' );
    return promise.then(
      (result) => next({ ...rest, result, readyState: 'success' }),
      (error) => next({ ...rest, error, readyState: 'failure' })
    );
  };
}

рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред
рдпрд╣ рдЖрдкрдХреЛ async рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЬреИрд╕реЗ рд▓рд┐рдЦрдиреЗ рджреЗрдЧрд╛

function doSomethingAsync(userId) {
  return {
    type: SOMETHING,
    promise: requestSomething(userId),
    userId
  };
}

рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдВ

{ type: SOMETHING, userId: 2, readyState: 'request' }
{ type: SOMETHING, userId: 2, readyState: 'success' }
{ type: SOMETHING, userId: 2, readyState: 'failure' }

рднреА,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░реА рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рдорддрд▓рдм рдерд╛:

{ type: SOMETHING, userId: 2, readyState: 'request' }
{ type: SOMETHING, userId: 2, result, readyState: 'success' }
{ type: SOMETHING, userId: 2, error, readyState: 'failure' }

рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ success рдпрд╛ failure рд╡рд╛рджреЗ рдХреЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗред

рдЖрдкрдХреЗ рдердВрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:

function makeASandwichWithSecretSauce(forPerson) {

  // Invert control!
  // Return a function that accepts `dispatch` so we can dispatch later.
  // Thunk middleware knows how to turn thunk async actions into actions.

  return function (dispatch) {
    return fetchSecretSauce().then(
      sauce => dispatch(makeASandwich(forPerson, sauce)),
      error => dispatch(apologize('The Sandwich Shop', forPerson, error))
    );
  };
}

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореИрдВ рдердВрдХ рдореЙрдбрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдВрднрд╡рддрдГ рд▓реЙрдЧрд┐рдВрдЧ рдпрд╛ рд╢рд╛рдпрдж "рдПрд╕рд┐рдВрдХ рдЗрди рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдмрд┐рдЬреА рдЗрдВрдбрд┐рдХреЗрдЯрд░" рдХреА рдЯреЙрдЧрд▓рд┐рдВрдЧ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ?

@justin808

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

рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ (рд▓реЛрдбрд┐рдВрдЧ, рд╕рдлрд▓, рдЕрд╕рдлрд▓) рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╢рдирд╕реНрдЯреЛрд░ рдмрдирд╛рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ Redux/Flux рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред

@gabrielgiussi рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/acdlite/redux-promise рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рджреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рд╛рдЬреНрдп рдХреЛ рд╣рд░ рд╕рдордп рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

@wmertens рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд░реЗрдкреЛ рдХреЛ рджреЗрдЦ рд▓реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд░рд╛рдЬреНрдп рдХреНрд░рдордмрджреНрдз рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрд╛ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдБ?

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

рд╕реЛрдо, 10 рдЕрдЧрд╕реНрдд, 2015, рдкрд░ 19:15 gabrielgiussi [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

@wmertens https://github.com/wmertens рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореЗ рд▓реВрдБрдЧрд╛
рд░реЗрдкреЛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд░рд╛рдЬреНрдп рдХреНрд░рдордмрджреНрдз рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрд╛ рдЖрдк
рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдБ?

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/gaearon/redux/issues/99#issuecomment -129531103ред

рд╡рд╛рдЙрдЯред
(рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛, рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХрд╛ рдмрд╣рд╛рдирд╛)

рдЕрд╕рд▓ рдореЗрдВ, рд╕реНрдЯреЛрд░ рдореЗрдВ рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд░рдЦреЗ рд╣реИрдВ, рд╡реЗ рд╕рд┐рд░реНрдл рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдЖрдИрдбреА, рд░рд╛рдЬреНрдп, рдкреЗрд▓реЛрдб) рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ рдФрд░ рдПрдХ рдПрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рджреЗ рдирд╣реАрдВ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рд╢рд╛рдпрдж рдХрд╣реАрдВ рдФрд░ рдХреБрдЫ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ, рдЬреЗрдИред рдзрдиреНрдпрд╡рд╛рдж @wmertensред

@gabrielgiussi

рдФрд░ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдмрдирд╛рддрд╛ рдФрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ

рд░рд╛рдЬреНрдп рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдЬреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИ, рди рдбрд╛рд▓реЗрдВред

рдорд╛рдлрд╝ рдХрд░рдирд╛ред рдореИрдВрдиреЗ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА

рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рджреЗрддрд╛ рд╣реИ

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рдЬреЛ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ (рдирд╛рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдерд╛):

export default class Action extends Immutable.Record({state: 'idle', api: null, type: null, payload: null, id: null}){
load(){
  return this.set('state','loading');
}

succeed(){
  return this.set('state','succeeded');
}

fail(){
  return this.set('state','failed');
}

ended(){
  return this.get('state') != 'loading' && this.get('state') != 'idle';
}

endedWithSuccess(){
  return this.get('state') == 'succeeded';
}

endedWithFailure(){
  return this.get('state') == 'failed';
}

trigger() {
  return (dispatch) => {
    dispatch({type: this.get('type') + '_START', action: this});
    let payload = this.get('payload');
    this.get('api').call({dispatch,payload}).then((result) => {
      dispatch({type: this.get('type') + '_SUCCESS',id: this.get('id'), result: result.result});
    }).catch((result) => {
        dispatch({type: this.get('type') + '_FAIL',id: this.get('id'), result: result.result});
      });
  }
}
}

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рд╣реИ (рджреЗрдЦреЗрдВ #539) рдпрд╣ рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рд░рд┐рдЯрд░реНрди рд╡рд╛рджреЗ рдФрд░ рдЙрди рд╕рднреА рд╡рд╛рджреЛрдВ рдХреЗ рд╣рд▓ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@gaearon рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрдкрдиреЗ https://github.com/rackt/redux/issues/99#issuecomment -112212639 рд▓рд┐рдЦрд╛ рд╣реИ,

рдХреНрдпрд╛ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░реЗрдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╣реИ? рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдПрдХ рдирдпрд╛ рдкреНрд░рд╢реНрди рд╣реИ, рддреЛ рдмрд╕ рд░рд┐рдПрдХреНрдЯ/рдлреНрд▓рдХреНрд╕ (рд░реЗрдбрдХреНрд╕) рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдЕрднреА рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ https://github.com/happypoulp/redux-tutorial

@ рдмреИрдВрдбрд░рд╕рди5144

рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ-рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред
рдХреБрдЫ рдРрд╕рд╛ рд╣реА https://github.com/pburtchaell/redux-promise-middleware рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рдерд╛

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

  • рдЖрдк рдПрдХ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рд╕реНрдерд┐рддрд┐ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдХреБрдЫ рдПрд╕рд┐рдВрдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ
  • рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА async рдХреНрд░рд┐рдпрд╛ рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЖрдкрдХрд╛ рд╕реНрдЯреЛрд░ рдкреНрд░рджреВрд╖рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛/рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирдпрд╛ рд╕реНрдЯреЛрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛?

рдХреНрдпрд╛ рдЖрдк рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╣рд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдХ рдирдпрд╛ рд╕реНрдЯреЛрд░ рдмрдирд╛рдПрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж рдореИрдВ рд╡рд╣ рдХрд░реВрдБрдЧрд╛

рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рдж...

рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рднреЛрд▓рд╛ рд╣реИ? (рдРрд╕рд╛ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)

// server.js
app.use(function (req, res) {
    match({тАж}, function (error, redirectLocation, renderProps) {
        тАж

        if (renderProps) {
            const store = configureStore();

            const promises = renderProps.components.map(function (component, index) {
                if (typeof component.fetchData !== 'function') {
                    return false;
                }

                return component.fetchData(store.dispatch);
            });

            Promise.all(promises).then(function () {
                res.status(200).send(getMarkup(store, renderProps));
            });
        }
    })
});
// home.js
export class Home extends Component {
    static fetchData() {
        return Promise.all([
            dispatch(asyncAction);
        ]);
    },

    componentDidMount() {
        const { dispatch } = this.props;

        Home.fetchData(dispatch);
    }
}

export default connect()(Home);
// action.js
export function asyncAction() {
    return (dispatch, getState) => {
        dispatch(request);

        return fetch(тАж)
            .then(response => response.json())
            .then(data => dispatch(requestSuccess(data)))
        ;
    }
}

рдореИрдВ @mattybow рдХреЗ рдкреНрд░рд╢реНрди https://github.com/rackt/redux/issues/99#issuecomment -112980776 (рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХ) рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕реА рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдереА (рдирд╣реАрдВ рдереА) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ componentWillMount рд╕реЗ рд╡рд╛рджреЛрдВ рдХреЛ рдХреИрд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП)ред

@chemoish рдореИрдВ рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ redux рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕рд┐рд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдФрд░ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдШрдЯрдХ рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рддрдм рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЧрд░ рд░рд╣рд╛? рдзрдиреНрдпрд╡рд╛рдж

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ "рдШрдЯрдХрдбрд┐рдбрдорд╛рдЙрдВрдЯ" рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

@ ms88privat рдореБрдЭреЗ рдЕрднреА рддрдХ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ, рди рд╣реА рдЗрд╕рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдВрдиреЗ рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЦреЛрд▓рд╛ рд╣реИ (рдиреЗрд╕реНрдЯреЗрдб рд╡рд╛рджреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг)ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред


componentDidMount рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рджреЗрдЦреЗрдВ https://facebook.github.io/react/docs/component-specs.html#mounting-componentdidmount)ред рдЖрдк рдЗрд╕ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЬреАрд╡рдирдЪрдХреНрд░ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред

рдпрджрд┐ рд╕реНрдЯреЛрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд░рд╛ рд╣реБрдЖ рд╣реИ (рдпрд╛ рдЬреЛ рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдЖрдк рдлрд┐рдЯ рджреЗрдЦрддреЗ рд╣реИрдВ) рдореИрдВ fetch рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдХрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/reactjs/redux/blob/master/examples/async/actions/index.js#L47 рдХреА рдЬрд╛рдВрдЪ

@ рдХреЗрдореЛрдЗрд╢

рдЕрдЧрд░ рд╕реНрдЯреЛрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд░рд╛ рд╣реБрдЖ рд╣реИ рддреЛ рдореИрдВ рд▓рд╛рдиреЗ рдХреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдХрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдорд╛рд░реНрдЧ рдкрд░ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рд╡рд╣ рдПрдХ рдПрд╕рдкреАрдП рд╣реЛ)

рдпрд╣ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдШрдЯрдХ рдЬрд┐рд╕реЗ рдХрдИ рдкреГрд╖реНрдареЛрдВ рдкрд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдореЗрдВ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

@chemoish рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред рдореИрдВ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рддреАрди рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХ рдорд┐рд▓реЗ:

  • рдШрдЯрдХ 1 (рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛Fetch1)

    • рдШрдЯрдХ 2 (рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛Fetch2)

    • рдШрдЯрдХ3 (рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛Fetch3)

рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкрд╛рд╕ "рдШрдЯрдХрдбрд┐рдбрдорд╛рдЙрдВрдЯ" рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪрд┐рдВрдЧ рдШреЛрд╖рдгрд╛рдПрдВ рд╣реИрдВ (рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрдирд╛)ред

рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реЗрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди URL рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рдШрдЯрдХ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдорд╛рдЙрдВрдЯ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред

рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЖрдкрдХрд╛ match рдлрд╝рдВрдХреНрд╢рди рдФрд░ renderProps рд╕рднреА рддреАрди рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рднреА рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪрд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рддрдм рдореБрдЭреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рддрд┐рдкрд╛рджрди?

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЖрдкрдХреЗ match function рд╕рдВрджрд░реНрдн рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред

@ ms88privat renderProps.components рд░рд╛рдЙрдЯрд░ рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдпрд╣ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИред @chemoish рдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдк рдЧрд╣рд░реЗ рдШрдЯрдХреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@DominicTobias thx, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдХреНрдпрд╛ рд╕рднреА рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

рд╢рд╛рдпрдж рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? https://github.com/gaearon/react-side-effect
рдиреЗрд╕реНрдЯреЗрдб рддрддреНрд╡реЛрдВ рд╕реЗ рд╕рднреА рдореЗрдЯрд╛ рдЯреИрдЧ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрдд: https://github.com/nfl/react-helmet

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдЫрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрд╕рд┐рдВрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдХреЛ рднрд░рдиреЗ рдХреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИред

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ @erikras рдиреЗ рдЕрдкрдиреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ redux-async-connect рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛?

@vtambourine рдореИрдВ https://github.com/markdalgleish/reial рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ рд╣реИ

рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдбреЗрдЯрд╛
n . рдкрд░ рдкреБрдирдГ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдХреЗ рдмрд╛рдж рджреВрд╕рд░реА рдмрд╛рд░ рд╣реБрдХ рд▓рд╛рдирд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛
рдЧреНрд░рд╛рд╣рдХред
╤В, резрео рдордИ реирежрезрем рдХреЛред 22:54 рдмрдЬреЗ, рд╢реЙрди рдореИрдереЗрд╕рди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@vtambourine https://github.com/vtambourine рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ
https://github.com/markdalgleish/reial рдЬреЛ рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ рд╣реИ

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/reactjs/redux/issues/99#issuecomment -198517067

рдпрд╣ рднреА рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдЪреБрдиреМрддреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ @erikras рдХрд╛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @vtambourine рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ redux-async-connect рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: #81 рдХреНрдпрд╛ redux-async-connect рдореГрдд рд╣реИ? .

@vtambourine рдПрдХ рдХрд╛рдВрдЯрд╛ рд╣реИ рдЬреЛ https://github.com/makeomatic/redux-connect рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдПрдкреАрдЖрдИ рд╣реИ, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ

@gaearon рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде

https://github.com/peter-mouland/react-lego-2016#redux -with-promise-middleware

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреИрд╕реЗ рдХрд░реЗрдВ?

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dmitry-zaets picture dmitry-zaets  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vslinko picture vslinko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

timdorr picture timdorr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mickeyreiss-visor picture mickeyreiss-visor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

elado picture elado  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ