Redux 和 promise 进度
Redux and promise progress
我如何在 redux 中处理和承诺进度?
我想在承诺执行时显示一些旋转条或其他东西,我正在使用 axios 来处理请求,但他们有一个 api 来处理进度这在请求的配置对象中:
{
progress: function(progressEvent) {
// Do whatever you want with the native progress event
}
}
但我只能在 redux 动作中发送请求,例如:
return {
type: "HTTP_REQUEST",
payload: axios.get("/webAPI/data", configObj)
}
在这些情况下,我该如何处理进度事件?
如果您只想显示微调器而不是进度条,那么您真的不需要进度功能。相反,我会推荐一些类似的东西:
const axiosAction = function(configObj) {
// We have to thunk the dispatch since this is async - need to use the thunk middleware for this type of construct
return dispatch => {
/* action to notify the spinner to start (ie, update your store to have a
loading property set to true that will presentationally start the spinner) */
dispatch({
type: 'AXIOS_REQUEST_STARTING'
});
return axios.get("/webAPI/data", configObj)
.then(res => {
/* action to set loading to false to stop the spinner, and do something with the res */
return dispatch({
type: 'AXIOS_REQUEST_FINISHED',
payload: res,
})
})
.catch(err => /* some error handling*/);
};
}
编辑为 redux-thunk
添加 link
虽然 gabdallah 的回答是正确的,但我觉得它只回答了部分问题。如果您愿意,可以轻松组合两个答案的代码。
如果您想要向用户显示进度,您可以从进度回调中调度特定的进度操作,并将当前进度作为有效负载。像这样:
{
progress: function(progressEvent) {
return dispatch({
type: "HTTP_REQUEST_PROGRESS",
payload: {
url: "/webAPI/data",
currentBytes: progressEvent.current,
totalBytes: progressEvent.total // properties on progressEvent made up by yours truly
}
});
}
}
本质上,您只需要另一个表示 request progress
的操作,就像您已经有一个用于发起请求的操作(可能同时代表成功和不成功的结果)。
我如何在 redux 中处理和承诺进度?
我想在承诺执行时显示一些旋转条或其他东西,我正在使用 axios 来处理请求,但他们有一个 api 来处理进度这在请求的配置对象中:
{
progress: function(progressEvent) {
// Do whatever you want with the native progress event
}
}
但我只能在 redux 动作中发送请求,例如:
return {
type: "HTTP_REQUEST",
payload: axios.get("/webAPI/data", configObj)
}
在这些情况下,我该如何处理进度事件?
如果您只想显示微调器而不是进度条,那么您真的不需要进度功能。相反,我会推荐一些类似的东西:
const axiosAction = function(configObj) {
// We have to thunk the dispatch since this is async - need to use the thunk middleware for this type of construct
return dispatch => {
/* action to notify the spinner to start (ie, update your store to have a
loading property set to true that will presentationally start the spinner) */
dispatch({
type: 'AXIOS_REQUEST_STARTING'
});
return axios.get("/webAPI/data", configObj)
.then(res => {
/* action to set loading to false to stop the spinner, and do something with the res */
return dispatch({
type: 'AXIOS_REQUEST_FINISHED',
payload: res,
})
})
.catch(err => /* some error handling*/);
};
}
编辑为 redux-thunk
添加 link虽然 gabdallah 的回答是正确的,但我觉得它只回答了部分问题。如果您愿意,可以轻松组合两个答案的代码。
如果您想要向用户显示进度,您可以从进度回调中调度特定的进度操作,并将当前进度作为有效负载。像这样:
{
progress: function(progressEvent) {
return dispatch({
type: "HTTP_REQUEST_PROGRESS",
payload: {
url: "/webAPI/data",
currentBytes: progressEvent.current,
totalBytes: progressEvent.total // properties on progressEvent made up by yours truly
}
});
}
}
本质上,您只需要另一个表示 request progress
的操作,就像您已经有一个用于发起请求的操作(可能同时代表成功和不成功的结果)。