redux - Redux createAsyncThunk 的进度条?
问题描述
我正在用 React + Redux 编写一个简单的程序。在里面createAsyncThunk
,我需要发送多个请求来发送数据块。现在我的代码如下所示;
export const sendData = createAsyncThunk<
void,
{
id: string;
data: Uint8Array;
}
>("files/upload", async (props) => {
const { uploadId } = await api.init();
try {
let i = 0;
while (props.data.length > i * CHUNK_SIZE) {
const chunkedData ... // Here I create chunked data from props.data.
await api.uploadFileChunk({
uploadId: uploadId,
data: chunkedData,
});
i++;
}
await api.complete({
id: props.id,
uploadId: uploadId,
});
} catch (err) {
await api.abort({ uploadId: uploadId });
}
});
目前,我在发送数据时显示一个加载栏,但它没有告诉进度。我想改进程序以显示进度条,因为如果要发送的数据很大,则需要很长时间。progress
我该如何管理createAsyncThunk
?
解决方案
每次加载块时,您都需要调度某种操作。这样,您的商店就会知道已加载了多少,并可以选择进度。该createAsyncThunk
函数旨在为 、 和 创建三个动作pending
创建fulfilled
者rejected
。
您可以在回调中访问第二个参数。props
那是thunkAPI
包含您商店dispatch
方法的对象。您应该能够在主回调中使用这些dispatch
附加操作。payloadCreator
注意catch
这里的 -ing 错误。我不确定,但我认为这会引起fulfilled
响应,因此您需要使用rejectWithValue
.
它应该看起来像这样(显然未经测试)
export const sendData = createAsyncThunk<
void,
{
id: string;
data: Uint8Array;
}
>(
"files/upload",
async (props, {dispatch, rejectWithValue}) => {
const { uploadId } = await api.init();
try {
let i = 0;
while (props.data.length > i * CHUNK_SIZE) {
const chunkedData = // Here I create chunked data from props.data.
await api.uploadFileChunk({
uploadId: uploadId,
data: chunkedData,
});
i++;
dispatch({
type: "files/uploadProgress",
percent: //calculate this
});
}
await api.complete({
id: props.id,
uploadId: uploadId,
});
} catch (err) {
await api.abort({ uploadId: uploadId });
rejectWithValue(err);
}
});
如果我正确地阅读了你的循环,我认为你想要i += CHUNK_SIZE
而不是i++
因为你一次上传一堆。我将由您来计算进度计算。
推荐阅读
- mysql - “新的临时证书过期太快:当前时间:”M
- css - 删除列之间的间距/填充
- python - How does the for keyword affect *in* expressions?
- reactjs - 如何正确初始化 React 中的函数?
- php - Laravel 5.8 - 如何将文件从存储目录移动到公共目录?
- php - 不能在 HTML_dom 和 curl 中刮价格
- reactjs - React Typescript 项目中的 SyntaxError 但 IDE 中没有编译器错误
- vb.net - 这些 VB.NET 方法是否更快:SaveSetting() 或 SetValue()?
- svg - SVG:用三种颜色填充矩形的最佳方法
- python - Lambda 函数进行 athena 查询,查询结果不在 S3 输出存储桶中