2016-05-25 32 views
6

当编写redux-thunk函数,被称为thunk可以很容易地提取样板的配额。例如,在我们的大部分异步API调用中,我们正在执行以下操作,没有任何副作用:还原thunk样板

export const LOGIN_REQUEST = 'my-app/auth/LOGIN_REQUEST'; 
export const LOGIN_RECIEVE = 'my-app/auth/LOGIN_RECIEVE'; 
export const LOGIN_FAILURE = 'my-app/auth/LOGIN_FAILURE'; 

// ... reducer code here 

export function login(loginHandle, password) { 
    return (dispatch, getState, api) => { 
    dispatch({ type: LOGIN_REQUEST }); 

    api.post('/auth/login', { loginHandle, password }).then(
     response => dispatch({ type: LOGIN_RECIEVE, response }), 
     error => dispatch({ type: LOGIN_FAILURE, error }) 
    ); 
    }; 
} 

简单!虽然,因为这涵盖了我们的要求的至少70%我敢肯定有一种优雅的方式抽象出配发上面的代码中,以这样的(伪代码):

export function login(loginHandle, password) { 
    return (dispatch, getState, api) => api('POST', LOGIN_REQUEST, '/auth/login', { loginHandle, password }); 
} 

当我们需要检查状态和其他副作用,我们可以回到适当的thunk。尽管在大多数情况下...我们可以减少这种情况?

任何优雅的想法?

回答

7

Redux Thunk可以让您从2.1.0开始注入自定义参数。

const api = createApi() // you would write this function 
const store = createStore(
    reducer, 
    applyMiddleware(thunk.withExtraArgument(api)) 
) 

// your action creator: 
function fetchUser(id) { 
    return (dispatch, getState, api) => { 
    // you can use api here 
    } 
} 

在未来,如果你的thunk太复杂,你可能要考虑redux-sagaredux-observable

+0

正如你在上面的问题中所看到的,我们已经注入了'api'作为参数。这个问题更关系到减少*请求,接收,失败*样板 – AndrewMcLagan

+0

对不起,我认为“这样的东西(伪代码)”意味着你不知道'withExtraArgument()',而恰巧碰巧提示了一个类似的API 。 –

+0

如果您想减少请求/接收/失败样板,请查看https://github.com/acdlite/redux-promise。 –

0

不幸的是,redux社区没有常见的方法来处理这个确切的问题。我个人认为,人们不应该害怕在redux上编写自己的定制包装来处理这种情况。

我创建了一个名为redux-tiles库,它实际上有你想要的:)例如,你的代码看起来像下面几乎确切API:

import { createTile } from 'redux-tiles'; 
const login = createTile({ 
    type: ['user', 'login'], 
    // params is an argument with which you call an action 
    fn: ({ api, params }) => api('POST', '/auth/login', params), 
}); 

正如你所看到的,没有这里的常数,还有一个减速器。这些东西是自动创建的,所以你不必去做,也可以测试它。还有其他的功能,比如嵌套(所以相同的功能将被应用于通过id获取物品,例如,但是它们会在reducer中正确更新)和缓存。您可以结帐示例here

Redux-saga也是一件好事,但它更多的是如果你需要某种反应性,如果你需要更传统的方法,只需要一种更方便的方式来描述你的行为并将它们结合起来,而不必重复自己,那么我发现我的图书馆是一个完美的匹配。