【问题标题】:Redux-saga upload file progress eventredux-saga 上传文件进度事件
【发布时间】:2017-09-07 22:55:47
【问题描述】:

我正在使用 redux-saga 上传文件,并且我正在尝试一种在上传进度发生变化时调度事件的方法:

const data = new FormData();

data.append('file', fileWrapper.file);

const uploadedFile = yield call(request, requestURL, {
  method: 'POST',
  headers: {
     'X-Requested-With': 'XMLHttpRequest'
  },
  body: data
});

知道如何附加上传进度事件吗?

【问题讨论】:

    标签: reactjs redux redux-saga


    【解决方案1】:

    首先,答案取决于你如何做uploadRequest。

    您似乎正在使用window.fetch API。此 API 不为您提供接收上传进度事件的方法。

    因此,您需要切换到使用 XMLHttpRequest 或以方便的方式包装它的库。我建议您查看axiossuperagent。它们都提供了一种监听进度事件的方法。

    下一个主题是如何在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});
               }
          });
      }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2018-12-13
    • 2019-05-18
    • 2018-06-19
    • 2016-05-18
    • 2010-11-20
    相关资源
    最近更新 更多