Rxjs 在订阅中调用next时维护主题发布顺序

Rxjs 在订阅中调用next时维护主题发布顺序,rxjs,rxjs5,Rxjs,Rxjs5,我遇到了一个bug,我确定这是因为受试者在next()ed时会同步触发事件 以下代码生成以下输出: mySubject.subscribe(score => { if (score === 2) { mySubject.next(score + 10); } }) mySubject.subscribe(score => console.log(score)) Ouput: 1 12 2 我能够获得正确输出(1,2,12)的唯一方法是将我的next()调用包装在s

我遇到了一个bug,我确定这是因为受试者在
next()
ed时会同步触发事件

以下代码生成以下输出:

mySubject.subscribe(score => {
  if (score === 2) {
    mySubject.next(score + 10);
  }
})
mySubject.subscribe(score => console.log(score))

Ouput:
1
12
2
我能够获得正确输出(
1,2,12
)的唯一方法是将我的
next()
调用包装在
setTimeout
中,使其异步。有没有合适的方法来处理我所缺少的这个问题?

这个怎么样

const plusTen$ = mySubject.filter(score => score === 2).map(score => score + 10);

mySubject.merge(plusTen$).subscribe(score => console.log(score))

如果您使用的是RxJS 5.5,我个人也会使用
setTimeout
。有一个
subscribeOn
操作符,您可以使用
async
调度器(
import{async}from'rxjs/scheduler/async'
)在新帧中运行每个发射,但它是不稳定的

因此,最简单的方法可能是使用
delay(0)
,它不会产生任何延迟,并像使用
setTimeout()一样异步传递所有内容:


请参阅实时演示(开放式控制台):

这确实满足了输出要求。理想情况下,我希望
mySubject
发出这些值。但你确实让我想到了如何在主题中加入一个“中间件”来修改排放。类似于,
mySubject$=mySubject.map(映射函数)
谢谢!订阅中的nexting是一种反模式吗?老实说,我认为通常是这样,但这取决于你需要做什么。也许真的没有更好的办法了。通常,如果您需要有条件地将一个发射转换为两个发射,您可以使用类似以下内容的
concatMap(score=>score==2?of(score,score+10):of(score))
import { Subject } from 'rxjs/Subject';
import { delay } from 'rxjs/operators';

const mySubject = new Subject();
const source = mySubject.pipe(delay(0));

source.subscribe(score => {
  if (score === 2) {
    mySubject.next(score + 10);
  }
})
source.subscribe(score => console.log(score));

mySubject.next(1);
mySubject.next(2);