Dva: ๋””์ŠคํŒจ์น˜(EFFECT_ACTION)์— ๋Œ€ํ•œ ๋ฐ˜ํ™˜ ์•ฝ์† ์ง€์›์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2016๋…„ 10์›” 19์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dvajs/dva

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@nickzheng ์ด ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๋ž˜ํ•‘ํ•˜๋ ค๋ฉด promise๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

๊ทธ๋ฆฌ๊ณ  dva์˜ ์˜ํ–ฅ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

* create({ payload }, { put, call }) {
  const { value, resolve, reject } = payload;
  // ไธ€ไบ›ๆ“ไฝœไน‹ๅŽ

  if (success) {
     resolve('done');
  } else {
     reject('error');
  }
}

@sorrycc์˜ ์ด์ „ ์•„์ด๋””์–ด๋Š” ๋””์ŠคํŒจ์น˜๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์œ„์น˜์— Promise๋ฅผ ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  dva๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋ณธ ํšจ๊ณผ๊ฐ€ resolve ๋ฐ reject๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  10 ๋Œ“๊ธ€

1. ๋น„๋™๊ธฐ์‹ ๋‹ซ๊ธฐ๋ฅผ ํ†ตํ•ฉ ํ•˜๋ ค๋ฉด https://ant.design/components/modal-cn/#components -modal-demo-async, onOk๊ฐ€ then this.setState({
๋ณด์ด๋Š”: ๊ฑฐ์ง“,
ํ™•์ธ ๋กœ๋”ฉ: ๊ฑฐ์ง“,
});

dva์—์„œ action์„ ๋””์ŠคํŒจ์น˜ํ•œ ํ›„,
๋ณด๋‚ด๋‹ค({
์œ ํ˜•: '์‚ฌ์šฉ์ž/๋งŒ๋“ค๊ธฐ',
ํŽ˜์ด๋กœ๋“œ: ๊ฐ’,
}); ๊ฐ’์€ ์•ฝ์†์ด ์•„๋‹ˆ๋ผ ํ–‰๋™์ž…๋‹ˆ๋‹ค.

  1. ํ•ด๊ฒฐ์ฑ…์€ ์ƒ์ ์— ํ‘œ์‹œ ๋ฐ ํ™•์ธ ๋กœ๋“œ ์ค‘ ์ƒํƒœ๋ฅผ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    1. dva์—์„œ action์„ ๋””์ŠคํŒจ์น˜ํ•œ ํ›„์—๋Š” promise์ด๊ณ  redux-thunk๋Š” promise๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋‚ด ์ ‘์‹œ๋Š” saga์˜ ๊ตฌํ˜„์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nickzheng ์ด ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๋ž˜ํ•‘ํ•˜๋ ค๋ฉด promise๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

๊ทธ๋ฆฌ๊ณ  dva์˜ ์˜ํ–ฅ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

* create({ payload }, { put, call }) {
  const { value, resolve, reject } = payload;
  // ไธ€ไบ›ๆ“ไฝœไน‹ๅŽ

  if (success) {
     resolve('done');
  } else {
     reject('error');
  }
}

@sorrycc์˜ ์ด์ „ ์•„์ด๋””์–ด๋Š” ๋””์ŠคํŒจ์น˜๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์œ„์น˜์— Promise๋ฅผ ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  dva๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋ณธ ํšจ๊ณผ๊ฐ€ resolve ๋ฐ reject๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/dvajs/dva-core/blob/0fa6888/test/effects-test.js#L332 -L365, ๋‚ด์žฅ ์ง€์› ๋””์ŠคํŒจ์น˜(EffectAction) ๋ฐ˜ํ™˜ ์•ฝ์†.

@sorrycc ๊ฐ€ ํ•˜๋‚˜๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ์–ด๋–ค ๋ฒ„์ „์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ๋ฌผ์–ด

@daskyrk ๋“ฑ #772

dva@2 ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Promise์— ๋Œ€ํ•œ ๋‚ด์žฅ ์ง€์› ์ดํ›„์— ์–ด๋–ป๊ฒŒ resolve์™€ reject๋ฅผ ์‹ค์ œ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
์„ฑ๊ณต์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•, ์‹คํŒจ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•?
@pizn์ด ์ œ๊ณต

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

๋‚ด์žฅ๋œ ์•ฝ์†์€ ์œ„๋ฅผ ์•„๋ž˜๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

dispatch({
  type: 'users/create',
  payload: {
    values,
    resolve,
    reject,
  },
})
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.log(err);
  })

ํ”„๋กœ์ ํŠธ

const { dispatch } = this.props;
dispatch({
   type: 'specification/fetch',
    payload: applicationId,
 }).then((data) => {
     console.log(data)
 });

๋ชจ๋ธ

 effects: {
    * fetch({ payload }, { call, put, select}) {
      const response = yield call(querySpecification, payload);
      yield put({
        type: 'list',
        payload: response
      });
      return yield select(state => state.specification.list);  //important
    }
},
reducers: {
    list(state, action) {
      return {
        ...state,
        list: action.payload
      };
    }
  }

@Youthink ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œํ•ด์•ผ ํ•  ์ผ

ํ”„๋กœ์ ํŠธ

this.props.dispatch({
    type: 'app/login',
    payload: {
        phone: '13312332131',
        smscode: '6666',
    }
}).then(data => {
    console.log('success result', data)
}).catch(err => {
    console.warn('error result', err)
})

๋ชจ๋ธ

*login({ payload }, { call, put }) {
    // ่ฏทๆฑ‚็Šถๆ€ fetching ไธบ true๏ผŒๆ–นไพฟ้กต้ขๆ˜พ็คบloading็Šถๆ€
    yield put({ type: 'updateState', fetching: true })
    // ่ฟ™้‡Œ่ฟ›่กŒ็™ปๅฝ• service
    const login = yield call(authService.login, payload)
    // ๅฆ‚ๆžœไธŠ้ข็š„ authService.login ๅผ‚ๅธธไบ†๏ผŒไธ‹้ข็š„้€ป่พ‘ๅฐฑไธไผš่ฟ›่กŒไบ†๏ผŒไธ‹้ข็š„ fetching ่ฎพ็ฝฎไธบ false ไนŸไธไผšๆ‰ง่กŒๅˆฐ
    if (login) {
        yield put(NavigationActions.back())
        Storage.set('login', login)
    }
    // ่ฟ™้‡Œ้‡็ฝฎไธ‹ ็Šถๆ€ fetching ไธบ false
    yield put({type:'updateState', fetching: false })
},

๋ฐฑ์—”๋“œ๊ฐ€ ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•˜๋“  ์˜ˆ์™ธ๊ฐ€ ์žˆ๋“  ์ƒ๊ด€์—†์ด yield put({type:'updateState', fetching: false }) ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๊ด€๊ณ„์—†์ด ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ์— ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰