dva中effect内调用另一个effect的,实现put阻塞式调用的方法

16 篇文章 1 订阅
15 篇文章 1 订阅

dva中effect内调用另一个effect的,实现put阻塞式调用的方法

在项目中通常会有在一个effect中调用另一个effect的需求,实现方法就是直接使用put

 *a({ payload}, {put, call,take}) {
      try {
      	  console.log(a)
          yield put({type: 'b',payload: {}});
          console.log(c)
          const info = yield call(serviceA, payload);
          put({
           type: 'save',
           payload: info,
          })
      }catch(e) {
      }
    },
    
 *b({ payload}, {put, call,take}) {
    yield call(serviceB, payload);
    console.log('b')
 }

但是put是一个非阻塞的方法,put的使用效果和在外部使用dispatch是一样的,所以上面的代码输出顺序是a,c,b,如果我们想等待b执行完再接下去执行a,就要用到take,take是redux-saga的方法当然再dva中也有,他是用来一次性监听dispatch过来的action的,而再effect 前后会额外触发 /@@start/@@end 的 action,我们就可以监听/@@end,从而来监听effect的执行结束,代码如下

 *a({ payload}, {put, call,take}) {
      try {
      	  console.log(a)
          yield put({type: 'b',payload: {}}); //触发b
          yield take('b/@@end') //直到监听到b结束才继续执行
          console.log(c)
          const info = yield call(serviceA, payload);
          put({
           type: 'save',
           payload: info,
          })
      }catch(e) {
      }
    },
    
 *b({ payload}, {put, call,take}) {
    yield call(serviceB, payload);
    console.log('b')
 }

这种阻塞的需求很常见,所以这种方法很有用.

但是这里有一个疑惑,call方法好像也能触发effect,在文档中有些,但是实际使用中call内部必须传入方法参数,不知道是什么问题,call本来就是阻塞方法,如果可以直接使用call是最好的,已经提了issuse希望可以解决

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值