Redux Observables:在mergeMap中返回不可观察的一般方法?

时间:2017-03-22 07:31:41

标签: redux-observable

观察到。

在我的史诗中,我只想调用第三方库来安排iOS上的推送通知(我正在使用本机反应):

import 'rxjs';
import { Observable } from 'rxjs';
import PushNotification from 'react-native-push-notification';

import * as calendarActions from '../ducks/calendar';

export default function cancelRSVPIfSignedIn(action$, store) {
  return action$.ofType(calendarActions.CANCEL_RSVP)
    .filter(() => store.getState().user.signedIn)
    .mergeMap(action => {
      return new Observable(observer => {
        const meetupId = action.payload;
        PushNotification.cancelLocalNotifications({ id: meetupId });
        observer.next(meetupId);
      });
    })
    .map(action => calendarActions.rsvpAdded(action.payload));
};

这样可以正常工作,但我想知道这是否是返回Observable的最常用方法,而只是调用observer.next()

1 个答案:

答案 0 :(得分:2)

如果您需要创建一个包含非可观察代码的Observable,而想要观察该代码的结果 - 这是关键部分。

如果您不关心副作用是否产生任何异常,错误,或者它是否异步完成,则将其包装在自定义Observable中是不必要的。您可以改为使用.do()运算符。

export default function cancelRSVPIfSignedIn(action$, store) {
  return action$.ofType(calendarActions.CANCEL_RSVP)
    .filter(() => store.getState().user.signedIn)
    .do(action => PushNotification.cancelLocalNotifications({ id: action.payload }))
    .map(action => calendarActions.rsvpAdded(action.payload));
};

然而,我想在你的代码中指出一个缺失的东西。您永远不会调用observer.complete(),这意味着您不小心将订阅泄露给该自定义Observable。每当一个新的CANCEL_RSVP进入另一个时,即使没有任何工作要做,也会创建并订阅(mergeMap)之前的粘贴。

请记住在完成后始终致电observer.complete(),除非您的Observable当然故意永远不会完成。

(另外,它会发出observer.next(meetupId)但后来.map(action =>,但这可能只是这个问题的拼写错误,而不是你的应用代码)