有时我的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(),但我不明白它是如何工作的。
我目前的解决方案是手动将链分解为单独的中间变量以进行检查,但这不是一个好的解决方案。
答案 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();
};