如何处理 redux saga 中的请求数组
How to handle array of requests in redux saga
我正在尝试从我的 React 本机应用上传多个文件。它在 yield 语句中给出 Unexpected Token
错误。
是否可以在循环中执行 yield
?
files.map((fileOb)=>{
const response=yield call(FileManager.uploadFile, fileOb)
yield put(Actions.fileUploaded(response))
})
谢谢,
抱歉我的英语不好
在上面的示例中,您在传递给 files.map
的回调中屈服。它不起作用,因为您只能在 Generator 函数中使用 yield
。
要处理并行请求,您可以生成效果数组
function* uploadFiles(files) {
const responses = yield files.map(fileOb => {
return call(FileManager.uploadFile, fileOb)
})
yield responses.map(response => {
return put(Actions.fileUploaded(response))
})
}
请注意,在这种情况下,所有调用都必须成功才能分派操作。也就是说,在所有调用都成功解决之前不会调度操作(否则 Saga 将取消剩余的调用并引发错误)。
另一种方式(也许是您所期望的)是为每个单独的进程(调用 -> 放置)并行 sagas。例如
function* uploadFiles(files) {
yield files.map(file => call(uploadSingleFile, file))
}
function* uploadSingleFile(file) {
try {
const response = yield call(FileManager.uploadFile, file)
yield put(Actions.fileUploaded(response))
} catch(err) {
yield put(Actions.fileUploadedError(response))
}
}
在后面的示例中,上传操作将在相应的调用返回后立即调度。此外,因为我们用 try/catch 块包围了每个单独的进程,所以任何错误都将单独处理,不会导致其他上传进程失败
这对我来说很有用,可以将多个文件传递给 uploadSingleFile 生成器函数。
function* uploadFiles(files) {
yield all(files.map(file => call(uploadSingleFile, file)));
}
我正在尝试从我的 React 本机应用上传多个文件。它在 yield 语句中给出 Unexpected Token
错误。
是否可以在循环中执行 yield
?
files.map((fileOb)=>{
const response=yield call(FileManager.uploadFile, fileOb)
yield put(Actions.fileUploaded(response))
})
谢谢, 抱歉我的英语不好
在上面的示例中,您在传递给 files.map
的回调中屈服。它不起作用,因为您只能在 Generator 函数中使用 yield
。
要处理并行请求,您可以生成效果数组
function* uploadFiles(files) {
const responses = yield files.map(fileOb => {
return call(FileManager.uploadFile, fileOb)
})
yield responses.map(response => {
return put(Actions.fileUploaded(response))
})
}
请注意,在这种情况下,所有调用都必须成功才能分派操作。也就是说,在所有调用都成功解决之前不会调度操作(否则 Saga 将取消剩余的调用并引发错误)。
另一种方式(也许是您所期望的)是为每个单独的进程(调用 -> 放置)并行 sagas。例如
function* uploadFiles(files) {
yield files.map(file => call(uploadSingleFile, file))
}
function* uploadSingleFile(file) {
try {
const response = yield call(FileManager.uploadFile, file)
yield put(Actions.fileUploaded(response))
} catch(err) {
yield put(Actions.fileUploadedError(response))
}
}
在后面的示例中,上传操作将在相应的调用返回后立即调度。此外,因为我们用 try/catch 块包围了每个单独的进程,所以任何错误都将单独处理,不会导致其他上传进程失败
这对我来说很有用,可以将多个文件传递给 uploadSingleFile 生成器函数。
function* uploadFiles(files) {
yield all(files.map(file => call(uploadSingleFile, file)));
}