You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]))));

额外需要修正的细节
  1. 你代码里的fromJs是笔误,Immutable.js的官方方法名是fromJS(大写的JS),不修正会导致新的错误。
  2. 这段代码里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:36:29