Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何仅缓冲来自可观察源的选定项目集,并立即发出其他项目?_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript 如何仅缓冲来自可观察源的选定项目集,并立即发出其他项目?

Javascript 如何仅缓冲来自可观察源的选定项目集,并立即发出其他项目?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,例如,我有一个每秒发射一个数字的可观测对象。我想将它们缓冲到数组中4秒钟。但是,当源发出一个可以被5整除的数字时,我想立即发出它,而不是缓冲它 // emit value in sequence every 1 second // 0,1,2,3,4,5... const source = interval(1000); // buffer values for 4 seconds const buffered = source.pipe( buffer(interval(4000)),

例如,我有一个每秒发射一个数字的可观测对象。我想将它们缓冲到数组中4秒钟。但是,当源发出一个可以被5整除的数字时,我想立即发出它,而不是缓冲它

// emit value in sequence every 1 second
// 0,1,2,3,4,5...
const source = interval(1000);

// buffer values for 4 seconds
const buffered = source.pipe(
  buffer(interval(4000)),
  filter(x => x.length > 0)  
);

const subscribe = buffered.subscribe(val => console.log(val));
我的预期结果是:

[0,1,2,3] // buffered and emitted after 4 seconds
[5] // emitted immediately
[4,6,7,8] // buffered and emitted after 4 seconds
[10] // emitted immediately
[9,11,12,13]
// ... and so on

Stackblitz:

让两个具有不同职责的可观察对象合并在一起怎么样

const source = interval(1000);

// buffer values for 4 seconds
const buffered = source.pipe(
  buffer(interval(4000)),
  filter(x => x.length > 0)  
);

const multipleOfFive = source.pipe(
  filter(x => x % 5 === 0)
);

const subscribe = merge(buffered, multipleOfFive).subscribe(val => console.log(val));

我不确定您是否也希望过滤第一个可见的5的倍数,但这很容易做到。

您可以使用
多播
将源流拆分为两个,然后使用不同的
过滤器
操作符再次合并它们

import { of, interval, Subject, merge } from 'rxjs';
import { bufferTime, multicast, filter } from 'rxjs/operators';

const buffered = source.pipe(
  multicast(new Subject(), s => merge(
    s.pipe(
      filter((value: number) => value % 5 === 0),
    ),
    s.pipe(
      filter((value: number) => value % 5 !== 0),
      bufferTime(4000),
    ),
  ))
);
您的最新演示: