我的控制器中有以下内容,在 Spring-Boot 应用程序中:
@RequestMapping(method=RequestMethod.GET,value="/info")
public DataModel getinfodata()
{
//this method runs some script which takes more than 3 minutes and sends the response back
return run_xyz()
}
在我的角度应用程序中,我有这个:
export class FetchService {
private _url:string="/info";
constructor(private _http:Http) { }
getData():any
{
return this._http.get(this._url).map((res:Response)=>res.json()).
catch(this.errorHandler).subscribe(data=>console.log(data));
}
errorHandler(error: Response){
console.error(error);
return Observable.throw(error || "Server Error");
}
我目前面临的问题是 Http get
正在对服务器进行静默重试,结果,我昂贵的脚本被调用了 3 或 4 次。有没有一种方法可以让get
只发出一个重试 0 次的请求,然后等到脚本完成,然后应该发回响应。我只调用一次getData方法。来自后端的响应快照 在端口 8080 上运行的 Tomcat 的快照 正常情况下的服务器响应快照,当脚本未运行时 Angular CLI 189 秒后的最终响应
http observable 为每个订阅者发出 http 请求。因此,3 到 4 http 请求意味着您必须同时订阅多个组件。要为多个观察者共享单个 http 请求,您需要类似共享运算符的东西。
export class FetchService {
data$: Observable<any>;
constructor(){
this.data$ = this._http.request(this._url)
.map((res:Response)=>res.json())
.catch(this.errorHandler)
.share();
}
getData(){
return this.data$;
}
}
现在,多个观察者将共享相同的可观察量。
此运算符是发布的一种专用化,当观察者数从 0 变为 1 时,它会创建一个订阅,然后与所有后续观察者共享该订阅,直到观察者数恢复为零,此时订阅被释放。
至于你的ERR_EMPTY_RESPONSE
问题。当我的代理 api 调用超时时,我遇到了这个问题。
最终,我想出了为什么会发生这种情况 开发服务器在这里使用http-proxy-middleware package
更多 并且此包中提供的代理选项来自底层http-proxy library
http-proxy 选项。其中之一是
代理超时:
代理未收到响应时的超时(以毫秒为单位(
默认值为 ~120 秒(根据我的观察(,如果服务器未能在规定的时间(120 秒(内响应,则向服务器发出新请求。使用代理配置文件中的"timeout":30000
覆盖默认超时解决了该问题。
{
"/info": {
"target": {
"host": "localhost",
"protocol": "http:",
"port": 8080
},
"secure": false,
"changeOrigin": true,
"logLevel": "debug",
"timeout":30000
}
}