Estoy tratando de cargar varios archivos desde mi aplicación nativa de reacción. Está dando un error de Unexpected Token en la declaración de rendimiento.
¿Es posible hacer yield dentro de un bucle?
files.map((fileOb)=>{ const response=yield call(FileManager.uploadFile, fileOb) yield put(Actions.fileUploaded(response)) })Gracias, lo siento por mi mal inglés.
En su ejemplo anterior, está cediendo dentro de la devolución de llamada pasada a files.map . No funciona porque puede usar el yield solo dentro de una función de Generador.
Para manejar solicitudes paralelas, puede producir matrices de efectos
function* uploadFiles(files) { const responses = yield files.map(fileOb => { return call(FileManager.uploadFile, fileOb) }) yield responses.map(response => { return put(Actions.fileUploaded(response)) }) }Tenga en cuenta que, en este caso, todas las llamadas deben tener éxito para enviar las acciones. es decir, las acciones no se enviarán hasta que todas las llamadas se resuelvan con éxito (de lo contrario, Saga cancelará las llamadas restantes y generará un error).
Otra forma (quizás lo que esperarías) es tener sagas paralelas para cada proceso individual (call -> put). Por ejemplo
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)) } }En el último ejemplo, se enviará una acción de carga tan pronto como se haya devuelto la llamada correspondiente. Además, debido a que hemos rodeado cada proceso individual con un bloque de prueba/captura, cualquier error se manejará individualmente y no hará que los otros procesos de carga fallen.
Esto funcionó para mí para pasar varios archivos a la función de generador uploadSingleFile.
function* uploadFiles(files) { yield all(files.map(file => call(uploadSingleFile, file))); }