这是我的伪代码:
const s = new Subject();
s.pipe(
bufferCount(1).pipe(
concatMap(() => new Promise()),
concatMap(() => new Promise()),
concatMap(() => new Promise()),
)
)
s.next('a');
s.next('b');
s.next('c');
我要保存在缓冲区“直到”“ a”中的“ b”和“ c”。
这可能吗?
答案 0 :(得分:1)
我想您希望source
可以触发某些任务,然后在上一个任务完成时仅让source
中的下一个值触发下一个任务。您可以通过zipping
source
和第二个触发器(startNext
)来实现此目的,该触发器指示上一个任务已完成,并且source
中的下一个值可以启动下一个任务被发射。
import { Subject, zip, of, BehaviorSubject } from 'rxjs';
import { map, tap, delay, concatMap } from 'rxjs/operators';
const source = new Subject();
const startNext = new BehaviorSubject(null);
zip(source, startNext)
.pipe(
map(([s, n]) => s), // discard the 'startNext' trigger
concatMap(s => of(s).pipe(delay(1000))),
concatMap(s => of(s).pipe(delay(200))),
concatMap(s => of(s).pipe(delay(3000))),
tap(_ => startNext.next(null))
).subscribe(s => console.log('result for', s));
source.next('a');
source.next('b');
source.next('c');