gpt4 book ai didi

asynchronous - Redux:使用异步中间件与在成功函数上分派(dispatch)操作

转载 作者:行者123 更新时间:2023-12-03 13:39:34 25 4
gpt4 key购买 nike

我正在尝试将 Redux 集成到我的 React 项目中。目前我没有使用任何 Flux 框架。

我的应用程序从 API 获取一些数据并以漂亮的方式显示它,如下所示:

componentDidMount() {
getData();
}

getData() {
const self = this;

ajax({
url: apiUrl,
})
.success(function(data) {
self.setState({
data: data,
});
})
.error(function() {
throw new Error('Server response failed.');
});
}

在阅读有关 Redux 的内容时,我确定了两种可能的方法,可用于处理在商店中存储成功数据:

  • 使用异步中间件,或者
  • 从 ajax 函数的成功回调中调度操作 ADD_DATA

但我不确定哪种方法更好。

回调中的分派(dispatch)操作听起来很容易实现和理解,而异步中间件则很难向不习惯使用函数式语言的人解释。

最佳答案

我个人更喜欢使用自定义中间件来完成此任务。在我看来,它使操作更容易遵循,并且样板代码更少。

我已经设置了中间件来查找从与特定签名匹配的操作返回的对象。如果找到此对象架构,则会对其进行特殊处理。

例如,我使用如下所示的操作:

export function fetchData() {
return {
types: [ FETCH_DATA, FETCH_DATA_SUCCESS, FETCH_DATA_FAILURE ],
promise: api => api('foo/bar')
}
}

我的自定义中间件发现该对象具有一个 types 数组和一个 promise 函数,并对其进行特殊处理。它看起来像这样:

import 'whatwg-fetch';

function isRequest({ promise }) {
return promise && typeof promise === 'function';
}

function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
} else {
const error = new Error(response.statusText || response.status);
error.response = response.json();
throw error;
}
}

function parseJSON(response) {
return response.json();
}

function makeRequest(urlBase, { promise, types, ...rest }, next) {
const [ REQUEST, SUCCESS, FAILURE ] = types;

// Dispatch your request action so UI can showing loading indicator
next({ ...rest, type: REQUEST });

const api = (url, params = {}) => {
// fetch by default doesn't include the same-origin header. Add this by default.
params.credentials = 'same-origin';
params.method = params.method || 'get';
params.headers = params.headers || {};
params.headers['Content-Type'] = 'application/json';
params.headers['Access-Control-Allow-Origin'] = '*';

return fetch(urlBase + url, params)
.then(checkStatus)
.then(parseJSON)
.then(data => {
// Dispatch your success action
next({ ...rest, payload: data, type: SUCCESS });
})
.catch(error => {
// Dispatch your failure action
next({ ...rest, error, type: FAILURE });
});
};

// Because I'm using promise as a function, I create my own simple wrapper
// around whatwg-fetch. Note in the action example above, I supply the url
// and optionally the params and feed them directly into fetch.

// The other benefit for this approach is that in my action above, I can do
// var result = action.promise(api => api('foo/bar'))
// result.then(() => { /* something happened */ })
// This allows me to be notified in my action when a result comes back.
return promise(api);
}

// When setting up my apiMiddleware, I pass a base url for the service I am
// using. Then my actions can just pass the route and I append it to the path
export default function apiMiddleware(urlBase) {
return function() {
return next => action => isRequest(action) ? makeRequest(urlBase, action, next) : next(action);
};
}

我个人喜欢这种方法,因为它集中了很多逻辑,并为您提供了 api 操作结构的标准执行方式。这样做的缺点是对于那些不熟悉 redux 的人来说可能有点神奇。我还使用 thunk 中间件,这两个中间件一起解决了我到目前为止的所有需求。

关于asynchronous - Redux:使用异步中间件与在成功函数上分派(dispatch)操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com