1

我正在尝试设置 redux、react-redux 和 redux-thunk。想法通常进展顺利,但我有一个问题,当将多个异步操作链接在一起时,事情应该如何看待。

具体来说,我有一个场景,可以通过另一个可以调用它们的动作单独或间接调用这些动作。我的问题是,selectItem如果我想成为惯用语,应该如何创作?

动作.js

export function fetchByContext(contextId) { 
    return dispatch => {
        _fetchByContext(messages => { 
            dispatch({ type: RECEIVE_MESSAGES, ... });
        });
    };
};

export function subscribeByContext(contextId) {
    return dispatch => {
        _subscribeByContext(messages => { 
            dispatch({ type: RECEIVE_MESSAGES, ... });
        });
    };
};

export function selectItem(contextId) {
    return dispatch => {
        subscribeByContext(contextId)(dispatch);
        fetchByContext(contextId)(dispatch);
    };
};
4

1 回答 1

1

我相信关键是(参考):

内部函数的任何返回值都可用作调度本身的返回值

如果 的内部函数返回一个 Promise fetchByContext()subscribeByContext()这些函数可以串联链接或从selectItem(). 一个未经测试的实现,假设既不_fetchByContext()也不_subscribeByContext()返回承诺将是:

export function fetchByContext(contextId) { 
    return dispatch => {
        return new Promise((resolve, reject) => {
            _fetchByContext(messages => { 
                dispatch({ type: RECEIVE_MESSAGES, ... });
                resolve(messages);
            });
        });
    };
};

export function subscribeByContext(contextId) {
    return dispatch => {
        return new Promise((resolve, reject) => {
            _subscribeByContext(messages => { 
                dispatch({ type: RECEIVE_MESSAGES, ... });
                resolve(messages);
            });
        });
    };
};

export function selectItem(contextId) {
    return dispatch => {
        // CALL IN SERIES
        return dispatch(subscribeByContext(contextId))
            .then(() => dispatch(fetchByContext(contextId)));
        // CALL IN PARALLEL (alternative to the code above; this is probably not what you want - just keeping for reference)
        return Promise.all(
            dispatch(subscribeByContext(contextId)),
            dispatch(fetchByContext(contextId))
        );
    };
}

再次请注意,上面的代码未经测试,只是希望为通用解决方案提供一个想法。

于 2016-05-30T08:22:07.497 回答