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 =>
但这可能只是这个问题中的错字,而不是您的应用程序代码)
可观察到。
在我的史诗中,我只想调用第 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 =>
但这可能只是这个问题中的错字,而不是您的应用程序代码)