我必须向用户一个接一个地显示N个引导弹出窗口。我目前确实有消息流要显示在每个弹出窗口中。如果我进行简单的订阅并显示消息,它将不会等待用户关闭弹出窗口并多次调用show('modal')
或更改消息以仅向用户显示最后一条消息。
一个疯狂的想法是使用debounce
运算符为每个通知添加延迟,并希望用户的大脑与您的延迟同步。
我一直在考虑使用回调函数为接收端创建通知流,以让我知道通知是否已被消耗。
export class CallbackNotification<T> {
parameter : T;
callbackFunction: () => any;
}
export function notifyAndMoveNext<T>(source: Observable<T>) : Observable<CallbackNotification<T>> {
let notifications = new BehaviorSubject<any>(0);
return
zip(source, notifications)
.pipe(map(([a, n]) => <CallbackNotification<T>> {
parameter = a,
callbackFunction = () => notifications.next(0)
}));
}
那我就可以做
notifyAndMoveNext(myMessagesObservable).subscribe(x => { this.currentNotification = x.callbackFunction; showModal(x.parameter); });
以及弹出窗口的按钮事件处理程序
this.currentNotification();
以上内容不适用于共享订阅(发布和refCount),还有其他人看不到的错误吗?你们有其他建议吗?
答案 0 :(得分:2)
解决方案是将每个通知消息转换成一个Observable(或Promise),该消息直到用户关闭该通知才完成。然后只需使用concatMap
。 concatMap将等待上一个消息完成,然后再订阅下一个
这是一个例子:
const showNotification = (notification) => {
// return a "cold" observable using RxJS defer function
// so that the notification is not shown until
// we are subscribed
return defer(() => new Promise(resolve => {
// when popup calls this.currentNotification() resolve the promise
this.currentNotification = resolve;
showModal(notification);
}));
};
notifications.pipe(concatMap(showNotification)).subscribe();