В вашем примере выше, вы получая внутри обратного вызова, переданного files.map
. Это не работает, потому что вы можете использовать yield
только внутри функции Generator.
Для обработки параллельных запросов, вы можете либо выход массивы эффектов
function* uploadFiles(files) {
const responses = yield files.map(fileOb => {
return call(FileManager.uploadFile, fileOb)
})
yield responses.map(response => {
return put(Actions.fileUploaded(response))
})
}
Обратите внимание, что в этом случае все вызовы должны добиться успеха с тем чтобы направить действия. т.е. действия не будут отправляться до тех пор, пока все вызовы не будут успешно разрешены (иначе Saga отменит остальные вызовы и вызовет ошибку).
Другой способ (возможно, то, что вы ожидаете) - иметь параллельные саги для каждого отдельного процесса (вызов -> поместить). Например,
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, любые ошибки будут обрабатываться индивидуально и не вызовет сбоев других процессов загрузки.