在订阅中调用 next 时维护 Subject 发射顺序
Maintaining Subject emission order when invoking next within subscription
我 运行 遇到了一个错误,我确定这是因为 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'
) 一起使用,以 运行 新帧中的每个发射,但它是 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
我 运行 遇到了一个错误,我确定这是因为 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'
) 一起使用,以 运行 新帧中的每个发射,但它是 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