美文网首页YAOPAI 团队博客React
使用Redux-thunk发Async Action的例子

使用Redux-thunk发Async Action的例子

作者: 雪牙那个前端 | 来源:发表于2016-04-15 11:47 被阅读5371次

    先贴官网链接:https://github.com/gaearon/redux-thunk

    简单的逻辑:
    首先,这是个关于action creator的解释。
    什么是action creator?返回action的函数。为什么要用action creator?图个方便吧:

    /* 使用前 */
    // 这里
    dispatch({
      type: ‘change_name’,
      name: ‘Peter’,
    });
    // 那里
    dispatch({
      type: ‘change_name’,
      name: ‘Ryan’,
    });
    /* ******************************** */
    /* 使用后 */
    // 这里
    dispatch(changeName(‘Peter’));
    // 那里
    dispatch(changeName(‘Ryan’));
    

    Thunk的做法就是扩展了这个action creator。
    Redux官网说,action就是Plain JavaScript Object。Thunk允许action creator返回一个函数,而且这个函数第一个参数是dispatch。

    这不是闹呢?

    所以不光改造action creator,如果你要用thunk,你还要把它放进middleware里去,这样函数类型的action就被thunk middleware捕获,根据你的函数逻辑,再去dispatch常规的action。
    这样Async Action其实就是发Ajax之前dispatch一发,收到服务器相应后dispatch一发,报错的话再来dispatch一发。为什么用?图个方便吧:

    /**
     * Sample Async Action namely: the thunk
     * 要配合redux-thunk这个middleware一起食用
     * ref: https://github.com/gaearon/redux-thunk
     */
    export const loadMoreWorkAsync = () => dispatch => {
      /* TODO: 请暂时无视我如此拙劣的dispatch行为 */
      /* 1. fetch之前,可以先发个pending的action */
      dispatch({
        type: LOAD_MORE_WORK,
        msg: 'pending',
      });
      fetch('imgs/test.json').then(resp => {
          // console.log('[resp]', resp.status);
        if (resp.status === 200) return resp.json();
        throw new Error('not 200 this time'); // 美滴很
      }).then(json => {
        /* 2. 异步结束了,发结果action */
        dispatch({
          type: LOAD_MORE_WORK,
          msg: json.name,
        });
      }).catch(error => {
        /* 3. 倒霉催的,发报错action */
        dispatch({
          type: LOAD_MORE_WORK,
          msg: error,
        });
      });
    };
    

    相关文章

      网友评论

      • Eanan:nice
      • fsiwan:新手提问:哪里用到了thunk,如何使用thunk?
        乾坤瞬间:action 本来是用来定义对象的,也就是{type:"sometype",...name} ,使用了thunk之后,就可以在action中使用dispath调用其他方法或者使用其他方法了,不然不能用.一般是把thunk作为中间件使用,就是createStore中定义,这样,store以及reducers就拥有了thunk的功能
        雪牙那个前端:redux-thunk 是用于 redux 中发送 async actions 的解决方案之一,详细解释可参考:https://redux.js.org/advanced/async-actions 或 https://github.com/gaearon/redux-thunk
      • 0eae732b7e2a:你好,我问一下,请求回来的数据如何使用呢?
        雪牙那个前端:数据返回之后在 then 方法里是可以 dispatch 的。可以搜索注释『异步结束了,发结果action』找到。
      • xiaoaiai:比官网清晰 真心的
      • xiaoaiai:简单明了 真心好
      • candice2cc:看概念说的很玄乎,本质上其实就是图个方便而已,👍
      • Yi罐可乐:2016.04.15 11:47
        作者 Amile1860
        写了1231字,被1人关注,获得了1个喜欢

      本文标题:使用Redux-thunk发Async Action的例子

      本文链接:https://www.haomeiwen.com/subject/xylnlttx.html