Redux Saga all方法使用报错:pages.filter不是函数问题排查
问题根源:
pages是Immutable List而非普通数组 你遇到的TypeError: pages.filter is not a function错误,核心原因是**yield all返回的pages是Immutable List类型,不是原生JavaScript数组**——Immutable List并没有继承原生数组的filter方法,自然无法调用。
从你打印的pages结构({size: 2, _origin: 0, ...})也能确认这一点:这是Immutable.js中List对象的典型特征。因为你之前的staticPagesData是通过Immutable List的filter方法得到的结果,用它的map生成generator集合传给yield all后,返回的结果依然保持Immutable List的结构。
解决方案:两种修复思路
思路1:转成原生数组处理
在传给yield all之前,把staticPagesData转换成原生数组,这样yield all返回的pages就是普通数组,就能正常使用filter、map等原生方法:
// 用toArray()把Immutable List转成原生数组 const pages = yield all( staticPagesData.toArray().map(page => backend(PagesApi, page.get('id'))) ); // 后续代码无需修改,pages已是普通数组 const staticPagesMetadata = pages .filter(({ result, err }) => !err && result.items.length > 0) .map(({ result }) => fromJS(buildMetadata(fromJS(result.items[0])))); // 注意:这里fromJs要改成fromJS(Immutable方法名是大写JS)
思路2:用Immutable API操作
如果想继续保持Immutable数据结构的使用,就改用Immutable List自身的filter和map方法(这些方法返回的依然是Immutable List,后续操作也要保持一致):
const staticPagesMetadata = pages // Immutable List的filter方法,参数逻辑和数组filter一致 .filter(({ result, err }) => !err && result.items.length > 0) // Immutable List的map方法 .map(({ result }) => fromJS(buildMetadata(fromJS(result.items[0]))));
额外需要修正的细节
- 你代码里的
fromJs是笔误,Immutable.js的官方方法名是fromJS(大写的JS),不修正会导致新的错误。 - 这段代码里的
id变量未定义:
你应该是想引用当前遍历的const key = staticPagesMetadata.findIndex(el => findPage(el, id));page的id,所以要改成:
否则会触发const key = staticPagesMetadata.findIndex(el => findPage(el, page.get('id')));ReferenceError: id is not defined。
内容的提问来源于stack exchange,提问作者raul782
相关产品推荐
相关产品推荐

