在订阅中调用下一个时维护主题排放顺序

时间:2018-02-15 12:28:14

标签: rxjs rxjs5

我遇到了一个错误,我已经确定了这个错误,因为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中以使其异步。有没有正确的方法来处理我错过的这个问题?

2 个答案:

答案 0 :(得分:2)

如果您使用的是RxJS 5.5,我个人也会使用setTimeoutsubscribeOn调度程序(async)可以使用import { async } from 'rxjs/scheduler/async'运算符来运行新帧中的每个发射,但它是not available in RxJS 5.5 right now

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

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);

查看实时演示(开放式控制台):https://stackblitz.com/edit/typescript-fiwgrk?file=index.ts

答案 1 :(得分:0)

这个怎么样?

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

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