まずは、あなたはどのようにuploadRequestを行うかによって答えが異なります。
window.fetch APIを使用しているようです。このAPIでは、アップロードの進捗状況を受け取る方法は提供されていません。
したがって、XMLHttpRequest
または便利な方法でそれをラップするライブラリを使用するように切り替える必要があります。 axiosとsuperagentを見ることをお勧めします。両方とも、進行状況イベントを聞く方法を提供します。
次のトピックは、進捗アクションをredux-saga
にディスパッチする方法です。フォークされた非同期タスクを作成し、そこにアクションをディスパッチするには、fork
を使用する必要があります。
function uploadEmitter(action) {
return eventChannel(emit => {
superagent
.post('/api/file')
.send(action.data)
.on('progress', function(e) {
emit(e);
});
});
}
function* progressListener(chan) {
while (true) {
const data = yield take(chan)
yield put({ type: 'PROGRESS', payload: data })
}
}
function* uploadSaga(action) {
const emitter = uploadEmitter()
yield fork(progressListener, emitter)
const result = yield call(identity(promise))
yield put({ type: 'SUCCESS', payload: result })
}
出典:https://github.com/redux-saga/redux-saga/issues/613#issuecomment-258384017
P.S.私の個人的な意見では、redux-sagaはこの種の機能を実装するのに適切なツールではありません。 redux-thunk
:
function uploadAction(file) {
return dispatch => {
superagent
.post('/api/file')
.send(action.data)
.on('progress', function(event) {
dispatch({type: 'UPLOAD_PROGRESS', event});
})
.end(function(res) {
if(res.ok) {
dispatch({type: 'UPLOAD_SUCCESS', res});
} else {
dispatch({type: 'UPLOAD_FAILURE', res});
}
});
}
}
nice solutionを使用すると、これを行うのがはるかにクリーンになりますか。 「アイデンティティ」と「約束」は、「イールドコール(アイデンティティ(約束))」行のどこにあるのかを詳しく説明できますか?ありがとう! –
私は先週、reduxとredux-sagaを使ってアップローダーを作成するのがいいアイデアを考えていました。だから私はそれのためのライブラリを作成することに決めました - https://github.com/el-davo/react-typescript-upload-saga –
Nikので、https://github.com/redux-saga/redux-サガ/ issues/613#issuecomment-258384017 –