在 Angular 中执行 Http get 方法,无需重试,并等待服务器发送响应



我的控制器中有以下内容,在 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
  
  }
}

最新更新