Rxjs 如何使用CombineTest和返回动态可观察的函数?
如果您使用的函数返回不同的可观察值,如:Rxjs 如何使用CombineTest和返回动态可观察的函数?,rxjs,Rxjs,如果您使用的函数返回不同的可观察值,如: const load = () => { if (!activated) { return of(null); } else { return of(123); } } 如果使用combinelatetest,即使将activated更改为true,此时返回的值也将始终保持不变 combineLatest(load(), b) .pipe(map(([num, str]) => `${num}:${str}`
const load = () => {
if (!activated) {
return of(null);
} else {
return of(123);
}
}
如果使用combinelatetest
,即使将activated
更改为true,此时返回的值也将始终保持不变
combineLatest(load(), b)
.pipe(map(([num, str]) => `${num}:${str}`))
.subscribe(data => log(`result: ${data}`))
b.next('a');
activated = true;
b.next('b'); // should log "123:b", but it doesn't
您可以在此处查看完整示例:
是否有任何解决方案可以始终获得更新版本
ps:我不能有一个订阅,因为它是一个来自localStorage的中间件您只需将
激活
可观察,并将其馈送加载()
。以下是从stackblitz中修改的
import { ReplaySubject } from 'rxjs/ReplaySubject';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { combineLatest } from 'rxjs/observable/combineLatest';
import {merge} from "rxjs/observable/merge";
import { of } from 'rxjs/observable/of';
import { defer } from 'rxjs/observable/defer';
import { map, switchMap } from 'rxjs/operators';
const activated = new BehaviorSubject<boolean>(false);
const b = new ReplaySubject<any>();
const load = (activated) => {
if (!activated) {
return of(null);
} else {
return of(123);
}
}
combineLatest(defer(() => activated.pipe(switchMap(x => load(x)))), b)
.pipe(map(([num, str]) => `${num}:${str}`))
.subscribe(data => log(`result: ${data}`))
b.next('a');
activated.next(true);
b.next('b'); // should log "123:b", but it doesn't
// Utils
function log(v) {
document.body.querySelector('pre').appendChild(document.createElement('div')).textContent = v;
}
从'rxjs/ReplaySubject'导入{ReplaySubject};
从'rxjs/BehaviorSubject'导入{BehaviorSubject};
从'rxjs/observable/combineLatest'导入{combinelateest};
从“rxjs/observable/merge”导入{merge};
从“rxjs/observable/of”导入{of};
从'rxjs/observable/defer'导入{defer};
从“rxjs/operators”导入{map,switchMap};
const activated=新行为主体(false);
const b=新的ReplaySubject();
常量加载=(已激活)=>{
如果(!已激活){
返回(空);
}否则{
归还(123);
}
}
组合测试(延迟(()=>activated.pipe(开关映射(x=>load(x))),b)
.pipe(映射([num,str])=>`${num}:${str}`)
.subscribe(数据=>log(`result:${data}`))
b、 下一个(‘a’);
已激活。下一个(true);
b、 下一个('b');//应该记录“123:b”,但它没有
//乌提尔斯
功能日志(v){
document.body.querySelector('pre').appendChild(document.createElement('div')).textContent=v;
}
您只需将激活
为可观察状态,并将其馈送load()
。以下是从stackblitz中修改的
import { ReplaySubject } from 'rxjs/ReplaySubject';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { combineLatest } from 'rxjs/observable/combineLatest';
import {merge} from "rxjs/observable/merge";
import { of } from 'rxjs/observable/of';
import { defer } from 'rxjs/observable/defer';
import { map, switchMap } from 'rxjs/operators';
const activated = new BehaviorSubject<boolean>(false);
const b = new ReplaySubject<any>();
const load = (activated) => {
if (!activated) {
return of(null);
} else {
return of(123);
}
}
combineLatest(defer(() => activated.pipe(switchMap(x => load(x)))), b)
.pipe(map(([num, str]) => `${num}:${str}`))
.subscribe(data => log(`result: ${data}`))
b.next('a');
activated.next(true);
b.next('b'); // should log "123:b", but it doesn't
// Utils
function log(v) {
document.body.querySelector('pre').appendChild(document.createElement('div')).textContent = v;
}
从'rxjs/ReplaySubject'导入{ReplaySubject};
从'rxjs/BehaviorSubject'导入{BehaviorSubject};
从'rxjs/observable/combineLatest'导入{combinelateest};
从“rxjs/observable/merge”导入{merge};
从“rxjs/observable/of”导入{of};
从'rxjs/observable/defer'导入{defer};
从“rxjs/operators”导入{map,switchMap};
const activated=新行为主体(false);
const b=新的ReplaySubject();
常量加载=(已激活)=>{
如果(!已激活){
返回(空);
}否则{
归还(123);
}
}
组合测试(延迟(()=>activated.pipe(开关映射(x=>load(x))),b)
.pipe(映射([num,str])=>`${num}:${str}`)
.subscribe(数据=>log(`result:${data}`))
b、 下一个(‘a’);
已激活。下一个(true);
b、 下一个('b');//应该记录“123:b”,但它没有
//乌提尔斯
功能日志(v){
document.body.querySelector('pre').appendChild(document.createElement('div')).textContent=v;
}
没错,还有demo没错,还有demo我的答案对你的意图有用吗?我的答案对你的意图有用吗?