rxjs:弹出流

时间:2018-12-05 17:50:10

标签: typescript rxjs

我必须向用户一个接一个地显示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),还有其他人看不到的错误吗?你们有其他建议吗?

1 个答案:

答案 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();