-
Notifications
You must be signed in to change notification settings - Fork 3.2k
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
请问一下 effects 中 yield put() 是一个非阻塞过程,如何做到 effects 中阻塞调用另一个 effect. #1212
Comments
dva@2 已经提供了相应的例子,sorrycc/blog#48 yield put({ type: 'addDelay', payload: { amount: 2 } });
yield take('addDelay/@@end');
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } }); |
redux-saga/redux-saga#744 但是在dva里面有一个问题,就是你要怎么获取你到你想调用的那个effect方法,因为dva里面的effect方法是写在model里面的,你自己想想看有没有什么方法从model里面获取目标方法,然后用call去调用吧。 |
请问这段代码是saga里面封装的吗??我在dva的源码里面看不到有哟。可以告诉我这段源码的地址吗? |
@hopperhuang 在 dva-core 里面 |
@hopperhuang dva 中的 effect 是写在 model 中的,我正是为这事儿烦,不知道如何取出来。看了 @nihgwu 的方法,我觉得是正解,先调用,然后立即 take 阻塞接收。 |
注意版本。我不知道大大提出解决方案是基于dva2,0的还是基于saga都试用的。dva1.0的源码里面,并没有对调用put之前和之后的事件进行一个封装,你可以问问大大,看看你自己的版本能不能适用该解决方案。
…-----原始邮件-----
发件人: "pingsoli" <notifications@github.com>
发送时间: 2017/9/12 22:24
收件人: "dvajs/dva" <dva@noreply.github.com>
抄送: "hopperhuang" <huanjiwe@126.com>; "Mention" <mention@noreply.github.com>
主题: Re: [dvajs/dva] 请问一下 effects 中 yield put() 是一个非阻塞过程,如何做到 effects 中阻塞调用另一个 effect. (#1212)
@hopperhuang dva 中的 effect 是写在 model 中的,我正是为这事儿烦,不知道如何取出来。看了 @nihgwu 的方法,我觉得是正解,先调用,然后立即 take 阻塞接收。
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
为什么要阻塞put,请问这里的应用场景是什么 |
如果 put 的 action 是被 saga (在 dva 中是 effect) 处理的,那么 yield put 返回时,对应的 saga/effect 还没有完成执行(redux-saga 的 scheduler 会将其入队,稍后再逐步调度),这样就不满足某些状态流程的阻塞要求。 如果我没有记错的话,put action 被 reducer 处理则没有这个问题,因为 yield put 返回时,对应的 reducer 已经执行完成了。 |
这些其实都是 redux-saga 的注意事项,只不过在 dva 中 effects 的写法,generator function 都是作为 effect、通过 put action 触发的。实际上会有很多 generator function 并不直接处理 action,而是被其他 saga/generator function 调用。 我个人的做法是,还原到直接使用 redux-saga 时的写法,只有直接响应 action 的 generator function 才放到 dva effects 中,其他一律游离出来。 const model = {
// ...
effects: {
* showItem({ payload }, { call }) {
// 用:
yield call(showItemFirstStageProcedure)
yield call(showItemSecondStageProcedure)
// 而不是:
// yield put({ type: 'showItemFirstStage' })
// yield take('showItemFirstStage/@@end')
// yield put({ type: 'showItemSecondStage' })
// yield take('showItemSecondStage/@@end')
// ...after second stage
},
// ...
// end effects
},
// ...
// end model
} 游离的 generator function 中需要 saga 的 import { effects } from 'dva/saga'
const { call, select } = effects 但是 dva 为其 effects 中的方法提供的 return { ...sagaEffects, put, take }; 或者就写完整的 action type: import { effects } from 'dva/saga'
const { take } = effects
// then
take(`${namespace}/${actionType}`) |
put.resolve()是阻塞的
put.resolve()就是阻塞的,详情见redux-saga API |
是的,我已经试过了yield put(reducers)是同步的 而yield put(effects)是异步的 |
为什么不能直接put ,非要yield put??? |
Code to reproduce the issue: (请提供可复现的代码或者步骤)
Expected behavior: (预期的正常效果)
Actual behavior: (实际效果)
Versions of packages used: (哪个库的哪个版本出现的问题)
The text was updated successfully, but these errors were encountered: