如何在 redux-observable 中处理异步函数?

Hongbo Miao

我正在使用 RxJS 和 redux-observable。

我正在尝试读取史诗中的文件。在我的情况下,我必须在史诗中做到这一点,因为其他一些史诗由expand操作员触发了这个史诗多次“未知”

但由于 FileReader 是异步的,下面的代码不起作用。

处理这个问题的正确方法是什么,尤其是 RxJS 方法?谢谢

export const uploadAttachmentEpic = (action$, store) =>
  action$
    .ofType(UPLOAD_ATTACHMENT)
    .map(action => {
      const reader = new FileReader();

      reader.onload = () => {
        return {
          ...action,
          payload: {
            ...action.payload,
            base64: reader.result
          }
        }
      };

      reader.readAsDataURL(action.payload.file);
    })
    .mergeMap(action =>
      ajax
        .post( /* use action.payload.base64 */ )
        .map(uploadAttachmentSucceed)
        .catch(uploadAttachmentFailed)
    );
杰菲尔普斯

范的回答(在撰写本文时)很好,但有一些重要的警告:

  • 它立即开始读取文件而不是懒惰地读取文件。因此readFile(file),即使在任何人订阅之前,只需调用即可启动它。这很容易出错,因为有人可能不会立即同步订阅它,然后reader.onload就会错过它。理想情况下,可观察对象是完全惰性且可重复的工厂。

  • 它从不调用obs.complete()观察者,因此订阅可能会导致内存泄漏,因为它永远不会结束。

  • 观察者上的方法不受约束,因此reader.onerror = obs.error实际上不会起作用。相反,您需要e => obs.error(e)obs.error.bind(obs) 查看此处以了解原因

  • 它不会在取消订阅时中止阅读。

这是我将如何做到的:

function readFile(file){
  // Could use Observable.create (same thing) but I
  // prefer this one because Observable.create is
  // not part of the TC39 proposal
  return new Observable(observer => {
    const reader = new FileReader();
    reader.onload = (e) => {
      observer.next(reader.result);
      // It's important to complete() otherwise this
      // subscription might get leaked because it
      // "never ends"
      observer.complete();
    };
    reader.onerror = e => observer.error(e);
    reader.readAsDataURL(file);

    // unsubscribe handler aka cleanup
    return () => {
      // LOADING state.
      // Calling abort() any other time
      // will throw an exception.
      if (reader.readyState === 1) {
        reader.abort();
      }
    };
  });
}

这种模式几乎可以应用于任何 API,因此了解它的工作原理非常方便。


我希望范不介意批评!我没有冒犯的意思,只是想分享知识。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在redux-observable中重新初始化动作?

来自分类Dev

如何在redux-observable中同时进行多个ajax调用?

来自分类Dev

如何在史诗 redux-observable 的 componentDidMount 方法中设置状态数据

来自分类Dev

如何在Promise函数中返回Observable

来自分类Dev

我如何在reactjs中使异步函数从redux动作中调用另外两个函数

来自分类Dev

如何在Redux中处理两个连续且相关的异步调用?

来自分类Dev

如何在组件中触发Redux函数

来自分类Dev

如何在Redux中调度函数?

来自分类Dev

如何在Node.js中处理异步函数

来自分类Dev

如何在Node.js中处理异步函数

来自分类Dev

如何在非伪造应用中编写异步redux动作

来自分类Dev

如何在与生命周期无关的类中处理 Observable?

来自分类Dev

如何在 redux 中使用异步操作

来自分类Dev

如何在Rx Observable中包装SKPaymentQueue

来自分类Dev

如何在RxJS中完成Observable

来自分类Dev

如何在Android中创建Observable?

来自分类Dev

如何在Firestore中从Observable捕获错误?

来自分类Dev

如何在 RxSwift 中组合多个 Observable

来自分类Dev

如何正确排序和响应RxJS和redux-observable中的动作?

来自分类Dev

如何在Redux Observable中调度一个动作,等待一秒钟,然后再调度两个动作?

来自分类Dev

如何在Redux中处理父子数据关系

来自分类Dev

如何在Redux Saga中处理请求数组

来自分类Dev

如何在 redux observable 史诗中为 ajax 响应发出两个动作

来自分类Dev

如何在 Redux 中触发回调函数?

来自分类Dev

如何使用Typescript在Redux reducer函数中实现详尽的switch语句?如何处理Redux的内部@@ redux动作

来自分类Dev

如何在Redux中实施数据约束

来自分类Dev

如何在Redux中更改输入值

来自分类Dev

如何在Redux中取消/忽略动作

来自分类Dev

如何在Redux中管理嵌套的reducer?

Related 相关文章

  1. 1

    如何在redux-observable中重新初始化动作?

  2. 2

    如何在redux-observable中同时进行多个ajax调用?

  3. 3

    如何在史诗 redux-observable 的 componentDidMount 方法中设置状态数据

  4. 4

    如何在Promise函数中返回Observable

  5. 5

    我如何在reactjs中使异步函数从redux动作中调用另外两个函数

  6. 6

    如何在Redux中处理两个连续且相关的异步调用?

  7. 7

    如何在组件中触发Redux函数

  8. 8

    如何在Redux中调度函数?

  9. 9

    如何在Node.js中处理异步函数

  10. 10

    如何在Node.js中处理异步函数

  11. 11

    如何在非伪造应用中编写异步redux动作

  12. 12

    如何在与生命周期无关的类中处理 Observable?

  13. 13

    如何在 redux 中使用异步操作

  14. 14

    如何在Rx Observable中包装SKPaymentQueue

  15. 15

    如何在RxJS中完成Observable

  16. 16

    如何在Android中创建Observable?

  17. 17

    如何在Firestore中从Observable捕获错误?

  18. 18

    如何在 RxSwift 中组合多个 Observable

  19. 19

    如何正确排序和响应RxJS和redux-observable中的动作?

  20. 20

    如何在Redux Observable中调度一个动作,等待一秒钟,然后再调度两个动作?

  21. 21

    如何在Redux中处理父子数据关系

  22. 22

    如何在Redux Saga中处理请求数组

  23. 23

    如何在 redux observable 史诗中为 ajax 响应发出两个动作

  24. 24

    如何在 Redux 中触发回调函数?

  25. 25

    如何使用Typescript在Redux reducer函数中实现详尽的switch语句?如何处理Redux的内部@@ redux动作

  26. 26

    如何在Redux中实施数据约束

  27. 27

    如何在Redux中更改输入值

  28. 28

    如何在Redux中取消/忽略动作

  29. 29

    如何在Redux中管理嵌套的reducer?

热门标签

归档