使用redux-api-middleware

时间:2017-01-10 18:41:09

标签: reactjs redux redux-api-middleware

我可以使用redux-api-middleware获取txt文件吗?如果有,怎么样?根据{{​​3}},如果不符合application / JSON,则正文设置为undefined,但我将得到的是一个简单的文本/简单

2 个答案:

答案 0 :(得分:0)

redux-api-middleware指南

这个库的优点是可以处理许多与发出HTTP请求时调度多个动作相关的样板。为什么异步Redux涉及调度多个动作?

使用Redux操作表示请求的有状态

来自redux docs:

当您调用异步API时,有两个关键时刻:您开始通话的那一刻,以及您收到答案(或超时)的那一刻。 我们首先需要定义与为任何给定主题id进行异步调用外部资源相关联的动作及其创建者。

承诺有三种可能的状态代表API请求:

  • 待定(请求)
  • 完成(请求成功)
  • 拒绝(请求失败 - 或超时)

使用redux-api-middleware,我们创建一个动作并定义其他类型,然后由中间件本身调度。

示例

开始使用redux-api-middleware库时,您应该记住的主要事项是:

  1. 使用正确的操作创建者签名并为不同的子操作定义正确的有效内容
  2. 使用中间件正确配置商店
  3. 以下是一个自包含的示例:

    import { createStore, applyMiddleware, combineReducers } from 'redux';
    import { apiMiddleware, CALL_API } from 'redux-api-middleware';
    import reducer from './reducer';
    
    const REQUEST = 'REQUEST';
    const RECEIVE = 'RECEIVE';
    const FAILURE = 'FAILURE';
    
    const store = createStore(reducer, {}, 
        applyMiddleware(apiMiddleware)
    );
    
    const fetchAction ={
      [CALL_API]: {
        endpoint: 'http://www.example.com',
        method: 'GET',
        types: [
          {
            type: 'REQUEST',
            payload: (action, state) => ({ action: state })
          },
          {
            type: 'SUCCESS',
            payload: (action, state, response) => {
              return response
            }
          },
          'FAILURE'
        ]
      }
    }
    
    store.dispatch(fetchAction).then(res => {
      console.log('success');
    }).catch(e => {
      console.log('failure');
    });
    

    在底层,基于promise isomorphic-fetch库用于发出HTTP请求。这意味着当我们使用redux-api-middleware认证的操作调用store.dispatch时, redux api中间件会返回一个承诺

    然后我们可以链接.then和.catch以使用我们想要的任何自定义逻辑来响应此请求的成功或失败。

答案 1 :(得分:0)

基本上,我所做的是更改fetch操作并使用响应数据进行自定义。示例:

fetch: async (...args) => {
    const response = await fetch(...args);

    if (response.ok && response.status === 200) {
      const reader = response.body.getReader();
      const type = response.headers.get('content-type');
      const filename = filenameExtractor(response.headers.get('content-disposition'));
      const { value } = await reader.read();

      fileSaver({ value, filename, type });
    }

    return response;
  },

这段代码读取响应内容,并将其推送到浏览器中。 filenameExtractorfileSaver是自定义函数。这种方式的响应不会改变。

使用这种方法,您可以进一步修改响应并自己创建json,以便将数据保存在redux中,例如:

const response = await fetch(...args);

return new Response(
    JSON.stringify({ data: response.body })
);