React / Redux / Meteor:在回调中调度动作的方法,被两次调用

时间:2020-01-21 18:43:05

标签: reactjs asynchronous meteor redux redux-thunk

我有一个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只会再次运行一次。但是我看不到为什么更改“值”会导致动作只运行一次,而运行两次呢?

我已经在网上搜索,但没有发现有关此问题的任何信息。

有人能想到我的动作为什么要运行两次,而让它只运行一次的方法吗?谢谢!

0 个答案:

没有答案