如何拦截/查看Immutable.js Map-或List链

时间:2017-09-27 15:10:03

标签: immutable.js

有时我的Redux选择器非常复杂。我需要一些方法来调试链中的每一步。

这是一个简化的选择器作为例子:

export const selectCompletedFilesForSaveToServer = state => {
  return state
    .getIn(['file', 'saveToServerQueue'])
    .filterNot(item => item.get('isPosting'))
    .valueSeq();
};

这就是我想要做的事情:

export const selectCompletedFilesForSaveToServer = state => {
  return state
    .getIn(['file', 'saveToServerQueue'])
    .intercept(item => console.log(item.toJS())
    .filterNot(item => item.get('isPosting'))
    .intercept(item => console.log(item.toJS())
    .valueSeq();
};

即。拦截函数应该采用抛出的任何集合(Map,List等),迭代集合,然后返回原始集合以进一步链接。

我尝试使用.forEach(),但我不明白它是如何工作的。

我目前的解决方案是手动将链分解为单独的中间变量以进行检查,但这不是一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

嗯..在写我的问题时,我有点透视并解决了它。

.filter()函数本质上是一个peek函数。只记得回归真实......

export const selectCompletedFilesForSaveToServer = state => {
  return state
    .getIn(['file', 'saveToServerQueue'])
    .filter(item => {
      console.log(item.toJS());
      return true;
    });
    .filterNot(item => item.get('isPosting'))
    .filter(item => {
      console.log(item.toJS());
      return true;
    });
    .valueSeq();
};
  
    

编辑:     我发现了一个更好的功能:.update()。它是可链接的,并将自定义函数作为参数。自定义函数将集合作为参数获取,并且应该返回集合(在我的用例中)。     https://facebook.github.io/immutable-js/docs/#/Collection/update

  

新例子:

export const selectCompletedFilesForSaveToServer = state => {
  const peek = function(collection) {
    console.log(collection.toJS());
    return collection;
  };

  return state
    .getIn(['file', 'saveToServerQueue'])
    .update(peek);
    .filterNot(item => item.get('isPosting'))
    .update(peek);
    .valueSeq();
};