我有一个React / Redux / Meteor应用程序,在该应用程序中我调度一个动作,该应用程序调用一个方法来从服务器获取值,并且该方法具有一个回调,在该回调中我调度一个动作以将返回的值保存在服务器中。 Redux商店。
我也在使用Redux thunk。
尽管我的原始动作只被发送了一次,但它运行了两次。似乎从方法回调内部分派操作会导致再次分派原始操作。
在我的React组件中:
class MyComponent extends Component {
....
render() {
...
}
}
function mapStateToProps(state, ownProps) {
return { value: state.myPartialState.value }
}
const Tracker = withTracker(({dispatch}) => {
const state = store.getState();
const isLoading = getIsLoading(state);
...
const handle = Meteor.subscribe('myData'), {
onReady: () => {
'onReady': () => {
secondaryPatternSubscriptions(patterns);
},
});
if (isLoading && handle.ready()) {
console.log('about to dispatch original action');
dispatch(getValue());
dispatch(setIsLoading(false));
} else if (!isLoading && !handle.ready()) {
dispatch(setIsLoading(true));
}
return { ... }
)(MyComponent);
export default connect(mapStateToProps)(Tracker);
在我的操作文件中:
export const SET_VALUE = 'SET_VALUE';
export function setValue(value) {
return {
'type': 'SET_VALUE',
'payload': value,
};
}
export const getValue = () => (dispatch, getState) => {
console.log('about to call');
Meteor.call('getValue', (error, result) => {
console.log('about to dispatch second action');
dispatch(setValue(result)); // this causes the action to be dispatched again
});
// dispatch(setValue(10)); // this only runs once
};
const initialState = {
value: 0,
}
export default function myPartialState(state = initialState, action) {
switch (action.type) {
case SET_VALUE: {
return updeep({ 'value': action.payload }, state);
}
}
}
在服务器上,方法如下:
Meteor.methods({
'getValue': function () {
...
return value;
},
})
我从控制台日志中看到,getValue仅调度一次,但运行两次。我已经一遍又一遍地检查了这一点,并且我几乎100%地确定getValue不会被调度两次。
我认为这与从方法回调内部调用操作有关;如果我注释出dispatch(setValue(result));并将其替换为方法调用之外的分派,则getValue仅运行一次。
如果我调度了一个不同的操作而不是setValue,或者更改了setValue操作以使它不会更改存储中的'value'属性,那么getValue只会再次运行一次。但是我看不到为什么更改“值”会导致动作只运行一次,而运行两次呢?
我已经在网上搜索,但没有发现有关此问题的任何信息。
有人能想到我的动作为什么要运行两次,而让它只运行一次的方法吗?谢谢!