Redux Observables:在 mergeMap 中 return non-observable 的一般方法?

Redux Observables: General way to return non-observable in mergeMap?

可观察到。

在我的史诗中,我只想调用第 3 方库来安排 iOS 上的推送通知(我使用的是 React Native):

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));
};

这很好用,但我想知道这是否是 return Observable 的最常见方法,并且在其中调用 observer.next()?

如果您需要创建一个包装非 Observable 代码的 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 => 但这可能只是这个问题中的错字,而不是您的应用程序代码)