2017-01-07 4 views
2

Я пытаюсь загрузить несколько файлов из моего собственного родного приложения. Он дает ошибку Unexpected Token об ошибке.Как справиться с массивом запросов в регрекс-саге

Это можно сделать yield внутри петли?

files.map((fileOb)=>{ 
const response=yield call(FileManager.uploadFile, fileOb) 
yield put(Actions.fileUploaded(response)) 
}) 

Спасибо, Извините за мой плохой английский

ответ

6

В вашем примере выше, вы получая внутри обратного вызова, переданного 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, любые ошибки будут обрабатываться индивидуально и не вызовет сбоев других процессов загрузки.