ES6中yield为保留字,react-redux-saga项目语法错误求助
解决React-Redux-Saga中「yield is a reserved word」语法错误
嘿,这个问题我太熟了!咱们先搞明白为啥报错:yield关键字只能直接用在generator函数(就是你写的function*这种)的顶层作用域里,绝对不能嵌套在普通函数里——比如你这里传给forEach的箭头函数,它不是generator,所以JS引擎会把yield当成非法的保留字报错。
给你几个实用的解决方案,按需选就行:
方案一:用for...of循环替换forEach
这是最直接省心的办法,把forEach换成for...of,这样yield就回到了generator函数的顶层作用域里,语法完全合法:
function* fixed(action) { for (const prop of props) { const res = yield put(blah); // 这里正常写你的业务逻辑就行 } }
方案二:用Redux-Saga的all effect实现并行执行(适合无顺序要求的场景)
如果这些put操作不需要按顺序执行,而是可以同时跑,那用Redux-Saga自带的all effect效率更高:
import { put, all } from 'redux-saga/effects'; function* fixed(action) { // 把每个prop对应的put effect放进数组 const effects = props.map(prop => put(blah)); // 并行执行所有effect,等待全部完成后拿到结果 const results = yield all(effects); // 统一处理所有结果 }
方案三:用子generator封装逻辑(适合复杂场景)
要是你的单条prop处理逻辑特别复杂,想单独封装成函数,可以写一个子generator,然后用yield*来调用它——不过这个方案一般用得少,除非真的有代码复用的需求:
function* fixed(action) { // 子generator:处理单个prop的逻辑 function* processProp(prop) { const res = yield put(blah); // 这里写复杂的单prop处理逻辑 } for (const prop of props) { // 委托给子generator执行 yield* processProp(prop); } }
总结一下,日常开发里用得最多的是方案一(for...of),简单直观;如果是并行场景就选方案二的all effect,效率拉满。
内容的提问来源于stack exchange,提问作者ErichBSchulz
相关产品推荐
相关产品推荐

