【Redux Saga炼金笔记】做一个可以重试N次的action

5 篇文章 0 订阅
2 篇文章 0 订阅

配方

  • action: redoable
  • effects: put, take, takeEvery

流程

  1. 点击按钮,执行sayHello的action
  2. sayHello的action只有执行第3次的时候才会成功
  3. 如果sayHello失败则自动重试直到成功或到达重试次数

实现

1 先定义一个redoable的action creator

/**
 * @params action: 需要被重试的标准action
 * @params successType: 当action成功后会被dispatch的action type
 * @params failureType: 当action失败后会被dispatch的action type
 * @params time: 重试最大次数
 */
function redoable(action, successType, failureType, time = 1) {
  return {
    type: 'REDOABLE',
    payload: {
      successType,
      failureType,
      action,
      time
    }
  };
}

2 点击按钮时dispatch一个REDOABLE的SAY_HELLO的action

function Hello({
  handleSayHello
}) {
  return (
    <div>
      <button onClick={handleSayHello}>Say Hello</button>
    </div>
  );
}

Hello = connect(
  () => ({}),
  (dispatch) => ({
    handleSayHello() {
      dispatch(redoable({
        type: 'SAY_HELLO'
      }, 'SAY_HELLO_SUCCESS', 'SAY_HELLO_FAILURE', 3));
    }
  })
)(Hello);

3 实现sayHello的saga来处理SAY_HELLO的action

function* sayHello(action) {
  times++;
  if (times < 3) {
    yield put({
      type: 'SAY_HELLO_FAILURE'
    });
    return;
  }

  times = 0;
  alert('Hello, nice to meet you!');
  yield put({
    type: 'SAY_HELLO_SUCCESS'
  });
}

4 实现redoableInvoke的saga来处理REDOABLE的action

function* redoableInvoke(action) {
  const {
    action: realAction,
    successType,
    failureType,
    time
  } = action.payload;

  yield put(realAction);
  const {type} = yield take([successType, failureType]);
  if (type === failureType) {
    if (time === 0) {
      return;
    }
    const nextAction = {...action};
    nextAction.payload = {...nextAction.payload, time: time - 1};
    yield put(nextAction);
  }
}

5 使用takeEvery来运行两个saga

store.runSaga(function * () {
  yield takeEvery('REDOABLE', redoableInvoke);
  yield takeEvery('SAY_HELLO', sayHello);
});
height="265" width="100%" scrolling="no" title="Redux Saga Cookbook 02" src="//codepen.io/awaw00/embed/BppVgJ/?height=265&theme-id=0&default-tab=js,result&embed-version=2" allowfullscreen="true">See the Pen <a href="http://codepen.io/awaw00/pen/BppVgJ/">Redux Saga Cookbook 02</a> by aaron wang (<a href="http://codepen.io/awaw00">@awaw00</a>) on <a href="http://codepen.io">CodePen</a>.&#10;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值