Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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
Rxjs 如何使用CombineTest和返回动态可观察的函数?_Rxjs - Fatal编程技术网

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我的答案对你的意图有用吗?我的答案对你的意图有用吗?