rxjs 条件 startWith , endWith 使用 iif 运算符
rxjs conditional startWith , endWith using iif operator
仍在研究 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 about not being able to use the spread syntax。如果该问题得到解决,那么您将不再需要 pipeFromArray
函数,并且解决方案可以简化为 source.pipe(...operators)
.
Re iif
: 请注意,iif
函数是一个 Observable 构造函数,而不是一个运算符函数。这意味着您不能使用 iif
作为 pipe()
内的运算符,如您所示。通过观察 RxJx reference page,您可以看到有两个部分,其中标题为 index
和 operators
。只有operators
下的函数可以在pipe()
内直接使用。 index
下的函数可用于构造源Observables。
关于startWith
和endWith
:这两个函数是运算符函数(意味着在pipe
内部使用)而不是Observables。 iif
函数需要一个 Observable 作为第二和第三个参数。
我遇到了同样的问题,但在尝试了不同的策略后,我想出了这个解决方案:
someObservable.pipe(
// anyOperator(),
condition ? conditionalOperator() : tap(() => {})
)
在这种情况下,如果条件为真,operatorA
被添加到管道,否则,tap(() => {})
就像一个“noop”(任何人都可以混合条件和参数以适应任何需要)。
仍在研究 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 about not being able to use the spread syntax。如果该问题得到解决,那么您将不再需要 pipeFromArray
函数,并且解决方案可以简化为 source.pipe(...operators)
.
Re iif
: 请注意,iif
函数是一个 Observable 构造函数,而不是一个运算符函数。这意味着您不能使用 iif
作为 pipe()
内的运算符,如您所示。通过观察 RxJx reference page,您可以看到有两个部分,其中标题为 index
和 operators
。只有operators
下的函数可以在pipe()
内直接使用。 index
下的函数可用于构造源Observables。
关于startWith
和endWith
:这两个函数是运算符函数(意味着在pipe
内部使用)而不是Observables。 iif
函数需要一个 Observable 作为第二和第三个参数。
我遇到了同样的问题,但在尝试了不同的策略后,我想出了这个解决方案:
someObservable.pipe(
// anyOperator(),
condition ? conditionalOperator() : tap(() => {})
)
在这种情况下,如果条件为真,operatorA
被添加到管道,否则,tap(() => {})
就像一个“noop”(任何人都可以混合条件和参数以适应任何需要)。