【问题标题】:Redux Observables / RxJS: How to make epic that returns different actions based on if / else?Redux Observables / RxJS:如何制作基于 if / else 返回不同动作的史诗?
【发布时间】:2017-04-02 04:18:26
【问题描述】:

我正在尝试使用以下方式将我的应用与应用内购买挂钩:https://github.com/chirag04/react-native-in-app-utils

我有一个史诗,如果成功,我想发出成功,如果失败,我想发出失败。像这样的:

import 'rxjs';
import { InAppUtils } from 'NativeModules';

import * as packagesActions from '../ducks/packages';
import * as subscriptionActions from '../ducks/subscription';

export default function createSubscription(action$, store) {
  return action$.ofType(packagesActions.SELECT)
    .mergeMap(action => {
      const productId = action.payload;
      InAppUtils.purchaseProduct(productId, (error, response) => {
        if(response && response.productIdentifier) {
          return subscriptionActions.subscribeSuccess();
        } else {
          return subscriptionActions.subscribeFailure();
        }
      });
    });
};

但是我不确定如何编写mergeMap 的内容。有没有办法做到这一点?

【问题讨论】:

    标签: rxjs redux-observable


    【解决方案1】:

    InAppUtils.purchaseProduct 似乎使用了 Node 风格的回调。有一个 RxJS 静态方法可用于从此类 API 调用创建一个 observable:bindNodeCallback。

    在您的mergeMap 中,您应该能够执行类似的操作

    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/observable/bindNodeCallback';
    import 'rxjs/add/observable/of';
    
    ...
    .mergeMap(action => {
      const productId = action.payload;
      const bound = Observable.bindNodeCallback((callback) => InAppUtils.purchaseProduct(productId, callback));
      return bound()
        .map(response => subscriptionActions.subscribeSuccess())
        .catch(error => Observable.of(subscriptionActions.subscribeFailure()));
    });
    

    【讨论】:

    • 您需要在bound() 前面添加一个return,因为mergeMap 在其回调中期望一个可观察对象作为返回值:)
    • @Sebastian 很好发现。谢谢。
    猜你喜欢
    • 2018-01-14
    • 2019-02-24
    • 2017-03-17
    • 2020-12-30
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2018-01-20
    相关资源
    最近更新 更多