效果:{
/**
* 数据查询
*
* <strong i="6">@param</strong> {any} { payload }
* <strong i="7">@param</strong> {any} { select, call, put }
*/
query: async function ({ payload }, { select, call, put }) {
await put({ type: 'show_loading' });
payload.page = payload.page || 1;
payload.limit = payload.limit || 10;
let data = await call(query, '/home/course', payload);
if (data) {
await put({
type: 'query_success',
payload: {
list: data.data,
total: data.count,
current: data.currentPage,
},
});
}
}
},
效果:{
/**
* 数据查询
*
* <strong i="6">@param</strong> {any} { payload }
* <strong i="7">@param</strong> {any} { select, call, put }
*/
query: function* ({ payload }, { select, call, put }) {
yield put({ type: 'show_loading' });
payload.page = payload.page || 1;
payload.limit = payload.limit || 10;
let data = yield call(query, '/home/course', payload);
if (data) {
yield put({
type: 'query_success',
payload: {
list: data.data,
total: data.count,
current: data.currentPage,
},
});
}
}
},
是的,effect 只支持 generator 的写法。async
和 await
可以在 effect 之外用,然后在 effect 里用 yield call 去调。
了解了,谢谢大神
请问,effect 有机会在将来支持 async 吗? @sorrycc
async 没有 generator 可控,比如不能 cancel
,这也是 redux-saga 选择用 generator 的原因。
哦
@sorrycc 请问要如何cancel一个effect呢?
@miaojiuchen 场景是啥? 为啥要 cancel effect ?
@sorrycc 我在遇到这样的场景:
这样在一个页面没问题,但是如果访问其他页面,再返回上页面,就会重复effect 2.
怎么能在effect 1 先cancel effect然后再触发effect 2?
是不是得用路径subcriptions 调用@@CANCEL_EFFECTS?
谢谢。
@sorrycc 既然你这里也提出了什么场景需要使用cancel,事实上大多数情况下async/await足矣。目前的用法里,用 generator/yield 再去调用 async/await,这样太蛋疼了,作者可以考虑同时支持两种模式,让用户自己去选择,比如增加一个配置项,开启后调用async/await模式,或者自适应判断。
可以试试redva,一样的dva框架,默认开启async/await和immer
最有用的评论
@sorrycc 既然你这里也提出了什么场景需要使用cancel,事实上大多数情况下async/await足矣。目前的用法里,用 generator/yield 再去调用 async/await,这样太蛋疼了,作者可以考虑同时支持两种模式,让用户自己去选择,比如增加一个配置项,开启后调用async/await模式,或者自适应判断。