如何解决rxjs 条件 startWith , endWith 使用 iif 运算符
仍在研究 rxjs 及其很棒的库(不得不承认)。鉴于我们有这个源和布尔值。
let source = [0,1,2,3,4,5,6,7,8,9];
let swEnabled = false;
let ewEnabled = false;
并且我们希望有条件地启用基于 swEnabled 和 ewEnabled 的 startwith 和 endwith 运算符到源.....
source.pipe(
iif(() => swEnabled,startWith(1000),),iif(() => ewEnabled,endWith(1000),).subscribe(
(n)=>{
console.log(n);
});
但没有快乐......任何人都可以提供一个例子吗?也许方法是错误的。或者你能提出一些替代方法吗?
提前致谢
解决方法
您可以有条件地构建一个运算符数组,如下所示:
import { MonoTypeOperatorFunction,of } from 'rxjs';
import { pipeFromArray } from 'rxjs/internal/util/pipe';
import { endWith,startWith } from 'rxjs/operators';
let source = of(0,1,2,3,4,5,6,7,8,9);
let swEnabled = false;
let ewEnabled = false;
let operators: MonoTypeOperatorFunction<number>[] = []
if (swEnabled) {
operators.push(startWith(1000))
}
if (ewEnabled) {
operators.push(endWith(1000))
}
source.pipe(pipeFromArray(operators)).subscribe(e => console.log(e))
目前有关于无法使用 pipe
内的 open issue 的 spread syntax。如果该问题得到解决,则您将不再需要 pipeFromArray
函数,解决方案可以简化为 source.pipe(...operators)
。
Re iif
:请注意,iif
函数是一个 Observable 构造函数而不是运算符函数。这意味着您不能将 iif
用作 pipe()
内的运算符,如您所示。通过观察 RxJx reference page,您可以看到有两个部分,其中包括 index
和 operators
。只有 operators
下的函数可以直接在 pipe()
中使用。 index
下的函数可用于构建源 Observables。
Re startWith
和 endWith
:这两个函数是操作符函数(用于 pipe
内部)而不是 Observables。 iif
函数需要一个 Observable 作为第二个和第三个参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。