调试时无法获取HTTP调用响应,但它存在于浏览器上



我只是发送一个HTTP请求来创建一个记录,然后在我尝试过Chrome、Firefox的浏览器的网络部分获得添加的记录id,但有趣的是,我在调试时无法获得相同的id值。这是我试图获取响应的代码和断点。我也尝试过使用promise等,但当它在其他电脑上工作时,我无法在我的电脑上获得它(我还关闭了防病毒应用程序等,并清理了浏览器历史记录,重新启动电脑,重新启动应用程序等(。但它们都没有任何意义。

this.myservice.create(<Employee>{ name: data.name, surname: data.surname })
.pipe(
tap((result) => {
// --> I am expecting to get result as id value as it 
// is seen on the Network tab of Google Developer tool
...

请注意,我的服务返回了一个可观察的结果,在这个sied上没有问题。问题很可能与浏览器或pc设置有关,例如防火墙等。

这可能取决于this.myservice.create的实现。如果实现了热切而不是懒惰,这意味着在订阅之前已经调用了http请求,实际上已经在网络检查器中为您提供了http响应。但只有当你将subscribe()发送到你的Observable时,它才会作为发射进入tap(),这会使整个流处于活动状态。

示例"懒惰"实现:

create() {
return Observable.Create((obs) => {
fetch('http://example.com/movies.json')
.then(response => {
obs.onNext(response.json()); 
obs.onCompleted();
});
});
}

这将仅在订阅可观察对象后调用fetch

渴望实现的例子:

create(){
const obs = new Rx.Subject();
fetch('http://example.com/movies.json')
.then(response => {
obs.next(response.json());
obs.complete();
});
return obs;
}

这将启动获取,即使尚未订阅可观察对象。它甚至可能导致竞争条件(在订阅之前已经推送了值(。

在我看来,拥有"热切"的可观察性通常是一种错误//反模式,因为除非工程师非常了解系统的工作原理,并对其进行完整的记录,否则它可能会导致非常令人困惑的结果。然后仍然。。。。

最新更新