Dva: рдкреНрд░рднрд╛рд╡ рдХреИрд╕реЗ рд░рджреНрдж рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЬреВрди 2018  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dvajs/dva

рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб: (рдХреГрдкрдпрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд рдХреЛрдб рдпрд╛ рдЪрд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ)

рдкрд░рд┐рджреГрд╢реНрдп: рдпрджрд┐ рдореЙрдбрд▓ рдП рдФрд░ рдореЙрдбрд▓ рдмреА рдХреЗ рдЕрдиреБрд░реВрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЛ рдкреГрд╖реНрда рдП рдФрд░ рдмреА рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдореЗрдВ рдХреБрдЫ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдХреЛ рд░реЗрдбреНрдпреВрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рд░рд╛рдЬреНрдпред

рдЬрдм рдореИрдВ рдкреЗрдЬ рдП рдпрд╛ рдкреЗрдЬ рдмреА рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЧрдВрджрд╛ рдбреЗрдЯрд╛ рди рдмрди рдЬрд╛рдПред
рдореИрдВрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реЗрдбреНрдпреВрд╕рд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдпреВрдирдорд╛рдЙрдВрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ
рдкреНрд░реЗрд╖рдг ({рдкреНрд░рдХрд╛рд░: ${model.namespace}/рд╕реНрдкрд╖реНрдЯ})

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░: (рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рднрд╛рд╡)

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреЗрдЬ рдП рд╕реЗ рдкреЗрдЬ рдмреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЙрдбрд▓ рдП рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░: (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡)

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

рдЬрдм рдореИрдВ рдП рдкреЗрдЬ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рдореИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╛ рдХрд┐рд╕реА рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рд╕рднреА рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? (рд░реЗрдбрдХреНрд╕-рд╕рд╛рдЧрд╛ рдореЗрдВ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди)

рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг: (рдХрд┐рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ)

v2.2.3

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

@ wss1942 рдзрдиреНрдпрд╡рд╛рдж!
рдЗрд╕ рддрд░рд╣, рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рд╡рд╛рд▓рд╛ рд╣реИред рдЖрдк рд╕реАрдзреЗ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрд╡реАрдП рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рднрд╛рд╡ред рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдкреВрд░реНрдг рдореЙрдбрд▓ рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛

import { getProduct } from '@/services/Products';
import { isRespSucc, showErrorMsg } from '@/utils/utils';

const initState = {};

export default {
  namespace: 'product',

  state: initState,

  effects: {
    /**
      хЬиф╕дф╕к Effects ф╣ЛщЧ┤шзжхПСф╕Аф╕кчлЮш╡Ыя╝Иraceя╝Й
      хжВцЮЬtaskхЕИч╗УцЭЯя╝МчлЮш╡Ыч╗УцЭЯуАВ
      хжВцЮЬtaskцЬкч╗УцЭЯцЧ╢цФ╢хИ░cancelя╝Мrace effect х░ЖшЗкхКихПЦц╢И taskуАВ
    */
    *cancelable({ task, payload }, { call, race, take }) {
      yield race({
        task: call(task, payload),
        cancel: take('cancel'),
      });
    },

    /**
      хПЦц╢ИцЙАцЬЙцЬкхоМцИРчЪДф╗╗хКбя╝Мх╣╢цЙзшбМцХ░цНоц╕ЕчРЖ
    */
    *clear(_, { put }) {
      yield put.resolve({ type: 'cancel' });
      yield put({ type: 'clearState' });
    },

    *getProduct({ payload }, { call, put, cancelled }) {
      // eslint-disable-next-line
      yield put.resolve({ type: 'cancelable', task: getProductCancelable, payload });

      function* getProductCancelable(params) {
        try {
          // ш░ГчФич╜Сч╗Ьшп╖ц▒В
          const response = yield call(getProduct, params);
          // ш┐ФхЫЮч╗УцЮЬхИдцЦн
          if (!isRespSucc(response)) {
            showErrorMsg(response);
            return;
          }
          // хПЦхА╝
          const { productName } = response.data;
          // ш░ГчФиreducerхнШхА╝
          yield put({
            type: 'saveState',
            payload: { productName },
          });
        } finally {
          if (yield cancelled()) {
            // TODO: хПЦц╢Ич╜Сч╗Ьшп╖ц▒В
          }
        }
      }
    },
    *getCity(_, { call, put, cancelled }) {
      // eslint-disable-next-line
      yield put.resolve({ type: 'cancelable', task: getCityCancelable });

      function* getCityCancelable() {
        // TODO: хЕ╖ф╜УхоЮчО░
      }
  },

  reducers: {
    saveState(state, { payload }) {
      const newState = { ...state, ...payload };
      return newState;
    },
    clearState() {
      return initState;
    },
  },
};


рд▓реЗрди-рджреЗрди рдЫреЛрдбрд╝рддреЗ рд╕рдордп (componentWillUnmount), рдбрд┐рд╕реНрдкреИрдЪ рдХреНрд▓рд┐рдпрд░ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдореЗрдВ рд╕рднреА рдЕрдзреВрд░реЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ getProductLoading рдФрд░ getCityLoading рдХрд╛ рднреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  componentWillMount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'product/getProduct',
      payload: {
        productNumber: '123456',
      },
    });
    dispatch({
      type: 'product/getCity',
    });
  }

  componentWillUnmount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'product/clear',
    });
  }

  function mapStateToProps(state) {
    return {
      getProductLoading: state.loading.effects['product/getProduct'],
      getCityLoading: state.loading.effects['product/getCity'],
    };
  }

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

рдЖрдк рдореЙрдбрд▓ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЙрдбрд▓ A рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рддрдм рд╕рд╛рдлрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдкреГрд╖реНрда рдПрдХ рдЧреИрд░-A рдкреГрд╖реНрда рд╣реЛ (рдПрдХ рдкреГрд╖реНрда рдЫреЛрдбрд╝реЗрдВ) рдпрд╛ рдПрдХ рдкреГрд╖реНрда (рдПрдХ рдкреГрд╖реНрда рджрд░реНрдЬ рдХрд░реЗрдВ)ред

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

рдореБрдЭреЗ рдореВрд▓ рдкреЛрд╕реНрдЯрд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред рдШрдЯрдХ рдХреА рд╕реНрдерд╛рдкрдирд╛ рд░рджреНрдж рд╣реЛрдиреЗ рдкрд░ рдореИрдВ рдЕрдзреВрд░рд╛ рдкреНрд░рднрд╛рд╡ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдерд╛ред рдбреАрд╡реАрдП рдЗрд╕ рддрд░рд╣ рдХреА рдПрдкреАрдЖрдИ @sorrycc рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рдирд╛ рдФрд░ рд╕рд╛рдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ

@dlamon рдХреЛ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдорд╛рд░реНрдЧ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рд╕рдлрд╛рдИ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдХреНрдпрд╛ рдЕрдм рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рд░реВрдЯ рд╕реНрд╡рд┐рдЪ рдХреЗ рджреМрд░рд╛рди @KyrieChen рдХреЗ рд╕рд╛рдл рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдЯ рд╕реНрд╡рд┐рдЪ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрдЪрд╛рд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдЪрд╛рд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЧрдВрджреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдл рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЙрдбрд▓ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдпреВрдпреВрдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдк-рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреЗ рдЕрдиреБрд░реВрдк рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдПрдХ рд▓реЗрдирджреЗрди рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реВрдВ (рдЬрдм рдХреЙрдореНрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ), рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреВрдпреВрдЖрдИрдбреА рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рд▓реЗрди-рджреЗрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (componentWillUnmount)ред рдиреАрдЪреЗ рдореЙрдбрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди:
2018-11-07 7 25 31
рдпрджрд┐ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╕реНрдкрд╖реНрдЯ рдореЙрдбрд▓ рдХреЗ рдмрд╛рдж рд╕рдВрдЪрд╛рд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рд░реЗрдбреНрдпреВрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпреВрдпреВрдЖрдИрдбреА рдкрд┐рдЫрд▓реЗ рд▓реЗрдирджреЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпреВрдпреВрдЖрдИрдбреА рд╣реИ, рддреЛ рдЧрдВрджрд╛ рдбреЗрдЯрд╛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдирджреЗрди рдХреЗ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣реЛрдЧрд╛ рдЕрдЧрд▓реЗ рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдирд╣реАрдВред рдкреНрд░рднрд╛рд╡ред

рд▓реЗрдХрд┐рди рдпрд╣ рддрд░реАрдХрд╛ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓рд╛, рдпрд╣ рддрд░реНрдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдирд┐рд░реНрдгрдп рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬреЛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рддреНрддреАрдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЧрдВрджреЗ рдбреЗрдЯрд╛ рд╕реЗ рдбрд░ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рддрд░реАрдХрд╛ рдЪреБрдирддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдбрдХреНрд╕-рд╕рд╛рдЧрд╛ рдореЗрдВ рд░рджреНрдж рдкреНрд░рднрд╛рд╡ рддрдВрддреНрд░ рдХреЗ рд╕рдорд╛рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбреАрд╡реАрдП рдЕрдм рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ @цИС

@dlamon рдореИрдВ рднреА рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЦреБрдж рдПрдХ рдбреЗрдореЛ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдереЛрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ https://codesandbox.io/s/yqwqpmvwvj

рд░рджреНрдж рдХрд░реЗрдВ namespace рд╕реЗ products рд╕реЗ model рдореЗрдВ effect рд╡рд┐рдзрд┐:
dispatch({ type: 'products/@<strong i="10">@CANCEL_EFFECTS</strong>' });

рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рд╣реИ?

        yield sagaEffects.fork(function*() {
          yield sagaEffects.take(`${model.namespace}/@@CANCEL_EFFECTS`);
          yield sagaEffects.cancel(task);
        });

@ wss1942 рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛ред рдпрджрд┐ рдкреНрд░реЗрд╖рдг ({type:'products/@ @CANCEL_EFFECTS '}) рд╕рдВрдмрдВрдзрд┐рдд рдореЛрдбрд▓ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рджреЗрдЧрд╛ред #796 . рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛

@dlamon dva рдПрдХ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЙрдбрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдХрдИ рдЧрд╛рдерд╛рдПрдБ рд▓рд┐рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

 namespace: 'products',
 effects: {
  *start(){},
  *stop(){},
  watchLogin: [
      function* ({ take, put, call, cancel, fork, cancelled }) {
          yield take('start');
          const timerTask = yield fork(timer)
          const bgSyncTask = yield fork(bgSync)
          yield take('stop')
          yield cancel(bgSyncTask)
          yield cancel(timerTask)

        function* bgSync() {
          try {
            while (true) {
              const result = yield call(delay, 5 * 1000);
              yield put({ type: 'stop' })
            }
          } finally {
            if (yield cancelled())
              yield put({ type: 'log', payload: 'fetchЁЯЫС' })
          }
        }
        function* timer(time) {
          let i=0;
          while (true) {
            yield put({ type: 'log', payload: i++ })
            yield delay(1000)
          }
        }
      },
      { type: 'watcher' },
    ],
}

bgSync рдЖрдкрдХрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрд╛рд░реНрдп рд╣реИ, рдЖрдк рдХрд╛рд░реНрдп рдХреЛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ : рдХрд╛рд░реНрдп рдХреЛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд░рджреНрдж рдХрд░реЗрдВ: рд░реЛрдХреЗрдВ ред рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рддреЛ рдЙрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрд╢рди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, axios рдХреЛ axios.CancelToken рдХреЗ рд╕рд╛рде рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ wss1942 рдзрдиреНрдпрд╡рд╛рдж!
рдЗрд╕ рддрд░рд╣, рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рд╡рд╛рд▓рд╛ рд╣реИред рдЖрдк рд╕реАрдзреЗ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрд╡реАрдП рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рднрд╛рд╡ред рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдкреВрд░реНрдг рдореЙрдбрд▓ рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛

import { getProduct } from '@/services/Products';
import { isRespSucc, showErrorMsg } from '@/utils/utils';

const initState = {};

export default {
  namespace: 'product',

  state: initState,

  effects: {
    /**
      хЬиф╕дф╕к Effects ф╣ЛщЧ┤шзжхПСф╕Аф╕кчлЮш╡Ыя╝Иraceя╝Й
      хжВцЮЬtaskхЕИч╗УцЭЯя╝МчлЮш╡Ыч╗УцЭЯуАВ
      хжВцЮЬtaskцЬкч╗УцЭЯцЧ╢цФ╢хИ░cancelя╝Мrace effect х░ЖшЗкхКихПЦц╢И taskуАВ
    */
    *cancelable({ task, payload }, { call, race, take }) {
      yield race({
        task: call(task, payload),
        cancel: take('cancel'),
      });
    },

    /**
      хПЦц╢ИцЙАцЬЙцЬкхоМцИРчЪДф╗╗хКбя╝Мх╣╢цЙзшбМцХ░цНоц╕ЕчРЖ
    */
    *clear(_, { put }) {
      yield put.resolve({ type: 'cancel' });
      yield put({ type: 'clearState' });
    },

    *getProduct({ payload }, { call, put, cancelled }) {
      // eslint-disable-next-line
      yield put.resolve({ type: 'cancelable', task: getProductCancelable, payload });

      function* getProductCancelable(params) {
        try {
          // ш░ГчФич╜Сч╗Ьшп╖ц▒В
          const response = yield call(getProduct, params);
          // ш┐ФхЫЮч╗УцЮЬхИдцЦн
          if (!isRespSucc(response)) {
            showErrorMsg(response);
            return;
          }
          // хПЦхА╝
          const { productName } = response.data;
          // ш░ГчФиreducerхнШхА╝
          yield put({
            type: 'saveState',
            payload: { productName },
          });
        } finally {
          if (yield cancelled()) {
            // TODO: хПЦц╢Ич╜Сч╗Ьшп╖ц▒В
          }
        }
      }
    },
    *getCity(_, { call, put, cancelled }) {
      // eslint-disable-next-line
      yield put.resolve({ type: 'cancelable', task: getCityCancelable });

      function* getCityCancelable() {
        // TODO: хЕ╖ф╜УхоЮчО░
      }
  },

  reducers: {
    saveState(state, { payload }) {
      const newState = { ...state, ...payload };
      return newState;
    },
    clearState() {
      return initState;
    },
  },
};


рд▓реЗрди-рджреЗрди рдЫреЛрдбрд╝рддреЗ рд╕рдордп (componentWillUnmount), рдбрд┐рд╕реНрдкреИрдЪ рдХреНрд▓рд┐рдпрд░ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдореЗрдВ рд╕рднреА рдЕрдзреВрд░реЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ getProductLoading рдФрд░ getCityLoading рдХрд╛ рднреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  componentWillMount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'product/getProduct',
      payload: {
        productNumber: '123456',
      },
    });
    dispatch({
      type: 'product/getCity',
    });
  }

  componentWillUnmount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'product/clear',
    });
  }

  function mapStateToProps(state) {
    return {
      getProductLoading: state.loading.effects['product/getProduct'],
      getCityLoading: state.loading.effects['product/getCity'],
    };
  }
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

seamys picture seamys  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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