观察到。
在我的史诗中,我只想调用第三方库来安排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()
?
答案 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 =>
,但这可能只是这个问题的拼写错误,而不是你的应用代码)