延迟从缓冲区释放直到完成后的承诺

时间:2019-05-14 21:58:01

标签: rxjs

这是我的伪代码:

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”。

这可能吗?

1 个答案:

答案 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');

https://stackblitz.com/edit/rxjs-g5efuc