Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dva #104

Open
ZhengXingchi opened this issue Aug 11, 2020 · 0 comments
Open

dva #104

ZhengXingchi opened this issue Aug 11, 2020 · 0 comments

Comments

@ZhengXingchi
Copy link
Owner

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

参考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希望可以解决

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant