Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Angular 如何比较两个冷可观测值';s源(不是它们发出的潜在流)_Angular_Typescript_Rxjs6 - Fatal编程技术网

Angular 如何比较两个冷可观测值';s源(不是它们发出的潜在流)

Angular 如何比较两个冷可观测值';s源(不是它们发出的潜在流),angular,typescript,rxjs6,Angular,Typescript,Rxjs6,场景:我正在使用publishReplay在Angular应用程序中缓存和重放某些Http请求(由于rxjs中修复了一些错误,因此在shareReplay上使用publishReplay) 我的问题是,如果检测到URL参数更改,我想强制缓存的可观察源更新自身,并使用publishReplay创建一个新的缓存可观察源。我认为也许可以通过询问/比较新提出的可观察对象与现有缓存的可观察对象的源来实现这一点,但我没有成功实现这一点 我在寻找什么:一种查询一个可观察对象的源的方法,以便我可以将其与另一个可

场景:我正在使用publishReplay在Angular应用程序中缓存和重放某些Http请求(由于rxjs中修复了一些错误,因此在shareReplay上使用publishReplay)

我的问题是,如果检测到URL参数更改,我想强制缓存的可观察源更新自身,并使用publishReplay创建一个新的缓存可观察源。我认为也许可以通过询问/比较新提出的可观察对象与现有缓存的可观察对象的源来实现这一点,但我没有成功实现这一点

我在寻找什么:一种查询一个可观察对象的源的方法,以便我可以将其与另一个可观察对象的源进行比较,看看它们是否相同(本例中为url),或者使用publishReplay更改的其他方法检测Http可观察对象上的url。此外,我正试图将这种逻辑抽象为一种缓存机制,这样我就不必在整个应用程序中散布检测参数是否更改的代码

下面是一个非常简单的例子,说明我想做的事情不起作用,输入源参数是包含http请求句柄的新Observable,而origSource是包含相同内容的前一个Observable(尽管可能使用publishReplay似乎不承认的不同url参数)

问题:有没有干净/可靠的方法,可以在没有订阅的情况下将其展平或深入到最可观察的内部

更新2:

现在我正在使用一种类似于下面的方法来提取innerObservable,可能有更好的方法,但这里是我们目前正在使用的方法:

// retrieve inner meta-data from cold observable for interrogation without subscribing
private extractInnerObservable<T>(source: Observable<T>): Observable<T> {
    let target = observableOf(source)['value'];
    while (target['source']) {
        target = target['source'];
    }

    return target;
}
//从cold observable中检索内部元数据,以便在不订阅的情况下进行查询
可观察(来源:可观察):可观察{
让target=observeof(source)['value'];
while(目标['source']){
目标=目标[‘源’];
}
回报目标;
}
结果方法:


结论:仍然可以肯定地探索其他选择,但我已经多次更新了这个问题,以分享我目前的情况,至少现在的情况是,它解决了最初的问题(尽管肯定不是以最优雅的方式)。然而,如果其他人也在为类似的想法而挣扎,那么分享这些疯狂行为的最终结果将是有价值的。

我想在这里反驳一下你的逻辑。如果要更改缓存请求的参数正在通过,请使用运算符进行更改

private paramSource = new Subject<string>(); // whatever type is appropriate
cached$ = this.paramSource.pipe(
  distinctUntilChanged(), // could add some custom compare function in here
  switchMap(param => this.makeRequest(param)),
  shareReplay(1) // whatever you wana do for caching
);

// call this whenever you might've wanted to run the observable inspection
updateParam(param: string) {
  this.paramSource.next(param);
}
private paramSource=新主题();//无论哪种类型都合适
缓存的$=this.paramSource.pipe(
distinctUntilChanged(),//可以在此处添加一些自定义比较函数
switchMap(param=>this.makeRequest(param)),
shareReplay(1)//无论您想为缓存做什么
);
//无论何时您可能想要运行可观察检查,都可以调用此函数
updateParam(参数:字符串){
this.paramSource.next(param);
}

如果这直接实现了你的目标,那就不是积极的,因为我有点不清楚你在追求什么,但希望这已经很接近了。

谢谢你为我擦洗了我的问题R.Richards。(非常感谢。)嗯,我很好奇为什么你需要缓存可观察的数据而不是值?另外,我很确定
source
origSource
不太可能是同一引用,因为它们代表由同一类创建的不同实例。我使用缓存的observable跨多个模块存储特定的http配置,但我同意比较在我的样本中永远不会起作用,因为它们是不同的对象引用。我不应该把它包括在内。我所期望的更可能是一个特定属性的比较,甚至可能是一个值比较,因为正如您所指出的,指针引用很可能永远不会是同一个指针引用。更新问题中的代码段以删除对象引用比较,因为这是误导性的。我认为有更好的方法来解决这个问题检查可观察对象本身。你能不能提供一个具体的例子,说明你正试图用伪代码的方式做些什么?我稍后会检查一下,谢谢。简而言之,我想看看一个可观察的URL(或URL的参数)是否在不发出HTTP请求的情况下发生了更改。嘿,bryan60,这一天离我有点远,所以我要到明天或周末才能继续玩这个。同时想知道,根据您提出的建议,您是否设想我们可以在不订阅http调用的情况下评估源代码?我之所以这么问,是因为其中一个关键约束是在不订阅/管道的情况下评估observable.source元数据,因为它们是HTTP请求。这让我希望观察源元数据(即具有URL属性的对象),而不实际“加热”http可观察对象,但这可能根本不是你的想法?我建议根本不要尝试评估源,当你检查这样的可观察对象时,这通常是一个坏迹象。您评估用于构建源的输入,并且仅在输入更改时更改源。观察物是热的还是冷的与这种方法无关。这两种方法都很好。您可能需要的唯一更改是将
paramSource
改为
ReplaySubject
,但我不确定是否需要,这取决于具体的gotcha-这看起来是一种有效的方法,只是想确保目的不是为了评估输入更改而触发http请求。再次感谢。
// retrieve inner meta-data from cold observable for interrogation without subscribing
private extractInnerObservable<T>(source: Observable<T>): Observable<T> {
    let target = observableOf(source)['value'];
    while (target['source']) {
        target = target['source'];
    }

    return target;
}
private paramSource = new Subject<string>(); // whatever type is appropriate
cached$ = this.paramSource.pipe(
  distinctUntilChanged(), // could add some custom compare function in here
  switchMap(param => this.makeRequest(param)),
  shareReplay(1) // whatever you wana do for caching
);

// call this whenever you might've wanted to run the observable inspection
updateParam(param: string) {
  this.paramSource.next(param);
}