我有一个有趣的问题,我似乎无法解决。我的应用程序使用HTTP调用各种端点,其中大多数都没有问题。特别是有一个让我头痛的问题,可能是最简单的一个。
我有一个服务,其中包含一个返回值如下所示的函数。
return this._http.post(this.baseEndPoint + this.uri, postc, options)
.map(res => res.json());
对我来说,这是非常标准的。奇怪的是,在任何错误响应/代码中,我的success / complete函数中的代码正在执行,并且在任何成功的响应中,我的错误函数中的代码正在执行。来自API的响应以404和204的形式返回,因此我希望它们会被相应地捕获。
this._service.function(param, param1)
.subscribe(
error => {
console.log(error);
},
() => {
console.log('lol wut');
}
);
这里没什么特别的。此外,我注意到我的请求正在进行两次网络呼叫,一次是由polyfill发起的,显示成功状态为200,但接着是另一次呼叫,状态为404,由“其他”触发。
所以,我的问题是 - 为什么这些被逆转了?我如何解决这个问题并允许他们被抓到适当的地方?为什么要拨打两个电话?
答案 0 :(得分:1)
我不确定您为什么会看到两个网络请求,但根据您的参数名称,我认为您的回调是否已被撤消? subscribe
的第一个参数可以是将在流上的next
通知上执行的函数,第二个参数将在error
通知上调用。第三个是完成通知。
this._service.function(param, param1).subscribe( onNext, onError, onComplete );
如果订单有问题,您还可以提供一个订阅对象来实现观察者界面,如下所示:
this._service.function(param, param1).subscribe({
next: x => console.log( x ),
error: x => console.error( x ),
complete: () => console.info( 'done!' ),
});
答案 1 :(得分:1)
由于请求选项,您看到两个网络请求,因为请求的跨源性质,Angular会发出预检HTTP OPTIONS请求。 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS。 此外,您的回调是以错误的顺序写的
this._service.function(param, param1)
.subscribe(
error => { // DONT CONFUSE with the name error, it can be any //name
console.log(error);
},
() => {
console.log('lol wut');
}
);
这里,第一个参数方法在成功时调用,第二个在出错时调用,第三个是我认为的信息。 实际的回调应该是
this._service.function(param, param1)
.subscribe(
data=>{
console.log("status code is ",data.status);},
error => {
console.log(error);
},
() => {
console.log('lol wut');
}
);
或根据您的需要。