简洁箭头函数:在数组多元素上调用生成器方法
用箭头函数简化批量
yield fork的方案 嘿,这个问题我太熟了!我之前在redux-saga项目里也遇到过类似的场景,总觉得用for-of循环写一堆yield fork不够优雅,后来发现用yield all结合数组映射(箭头函数)就能完美解决,比循环简洁多了。
先看你现在的for-of写法(大概是这样?)
import { fork } from 'redux-saga/effects'; function* mySaga() { const taskList = [fetchUserSaga, fetchPostsSaga, fetchCommentsSaga]; for (const task of taskList) { yield fork(task); } }
更简洁的箭头函数+yield all方案
我们可以用数组的map方法(箭头函数在这里派上用场)生成一个包含所有fork effect的数组,然后用yield all一次性执行它们:
import { all, fork } from 'redux-saga/effects'; function* mySaga() { const taskList = [fetchUserSaga, fetchPostsSaga, fetchCommentsSaga]; yield all(taskList.map(task => fork(task))); }
为什么直接用箭头函数写yield不行?
你之前尝试箭头函数失效,是因为yield只能在generator函数内部使用,而箭头函数是普通函数,没法直接在里面写yield fork(...)。但我们不需要在箭头函数里用yield——我们只需要用箭头函数生成一个个fork effect对象,再交给yield all来统一处理,这样就绕开了这个限制。
带参数的任务怎么处理?
如果你的任务需要传参,箭头函数也能轻松搞定:
import { all, fork } from 'redux-saga/effects'; function* mySaga() { // 用数组存任务和对应的参数 const taskConfigs = [ { saga: fetchUserSaga, args: [123] }, { saga: fetchPostsSaga, args: ['tech', 10] }, { saga: fetchCommentsSaga, args: [456] } ]; yield all(taskConfigs.map(({ saga, args }) => fork(saga, ...args))); }
这种写法不仅比for-of循环更简洁,还能清晰表达“并行启动所有任务”的意图,代码可读性也更高。
内容的提问来源于stack exchange,提问作者Noitidart
相关产品推荐
相关产品推荐

