RXJS 修改订阅者的顺序
RXJS modify order of subscribers
是否可以保证一个订阅者在观察者队列中是最后执行的? delay(0)
对我来说不是选择,因为我需要代码在线执行而不是异步执行。
let observable = new Subject<void>();
//delay(0) no option!
observable.pipe().subscribe(() => console.log("I want to be last!"));
observable.subscribe(() => console.log("I want to be first!"));
observable.next();
我在这里创建了一个示例:https://stackblitz.com/edit/rxjs-demo-xuf2ru
我想要第一个订阅者,最后执行。当前控制台输出为:
I want to be last!
I want to be first!
您可以创建 2 个具有所需输出的可观察对象,然后使用 mergeMap 运算符来保留顺序。
const observable1 = Observable.of("I want to be first!");
const observable2 = Observable.of("I want to be last!");
observable1
.mergeMap(x => {
console.log(x);
return observable2;
})
.subscribe(x => console.log(x));
您也可以使用通用的 Subject 作为 observable 之间的通信方式,如下所示:
const observable = new Subject<void>();
const commonSub$ = new Subject();
observable.pipe().subscribe(() => {
commonSub$
.subscribe(() => {
console.log('I want to be last!');
});
});
observable.subscribe(() => {
console.log('I want to be first!');
commonSub$.next(true);
});
observable.next();
因此,只有在记录第二条消息后,才会记录第一条消息。
根据您的最新评论,您可以使用 switchMap 来确保为多个事件实现相同的功能:
observable
.switchMap(() => {
return commonSub$;
})
.subscribe(() => {
console.log("I want to be last!");
});
observable.subscribe(() => {
console.log("I want to be first!");
commonSub$.next(true);
});
是否可以保证一个订阅者在观察者队列中是最后执行的? delay(0)
对我来说不是选择,因为我需要代码在线执行而不是异步执行。
let observable = new Subject<void>();
//delay(0) no option!
observable.pipe().subscribe(() => console.log("I want to be last!"));
observable.subscribe(() => console.log("I want to be first!"));
observable.next();
我在这里创建了一个示例:https://stackblitz.com/edit/rxjs-demo-xuf2ru
我想要第一个订阅者,最后执行。当前控制台输出为:
I want to be last!
I want to be first!
您可以创建 2 个具有所需输出的可观察对象,然后使用 mergeMap 运算符来保留顺序。
const observable1 = Observable.of("I want to be first!");
const observable2 = Observable.of("I want to be last!");
observable1
.mergeMap(x => {
console.log(x);
return observable2;
})
.subscribe(x => console.log(x));
您也可以使用通用的 Subject 作为 observable 之间的通信方式,如下所示:
const observable = new Subject<void>();
const commonSub$ = new Subject();
observable.pipe().subscribe(() => {
commonSub$
.subscribe(() => {
console.log('I want to be last!');
});
});
observable.subscribe(() => {
console.log('I want to be first!');
commonSub$.next(true);
});
observable.next();
因此,只有在记录第二条消息后,才会记录第一条消息。
根据您的最新评论,您可以使用 switchMap 来确保为多个事件实现相同的功能:
observable
.switchMap(() => {
return commonSub$;
})
.subscribe(() => {
console.log("I want to be last!");
});
observable.subscribe(() => {
console.log("I want to be first!");
commonSub$.next(true);
});