0

可观察的。

在我的史诗中,我只想调用一个 3rd 方库来安排 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));
};

这工作正常,但我想知道这是否是最常见的返回 Observable 并在其中调用的方法observer.next()

4

1 回答 1

2

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

于 2017-03-22T08:02:08.190 回答