延迟可观察

时间:2020-04-13 13:29:40

标签: angular observable

我正在处理一种情况,例如“要求在应用程序中的每个Post调用之前先调用一个Dummy get Api调用”。

注意:1.实际的帖子调用应在虚拟get调用完成后开始一次。 2。需要通过仅在服务文件中编辑代码来解决该问题。

这是我的问题,

Component.ts

this._service.dopost().subscribe(
  data => { console.log(data); });

Service.ts

   dopost() {
         this._http.get(dammyUrl, body, {
            observe: "response",
            headers: headers 
          }).subscribe((responce)=>{
            return this._http.post(url, body, {
               observe: "response",
               headers: headers 
            });
          });

  } 

堆栈闪电链接

https://stackblitz.com/edit/angular-qa1ztz

2 个答案:

答案 0 :(得分:1)

您需要使用SwitchMap Operator

映射到可观察的,完整的先前内部可观察的,发出值。

dopost():SecondResponseType  {
    return this._http.get<InitialResponseType>('dammyUrl', {}, {
        observe: 'response',
        headers: {} 
        }).pipe(
            switchMap((initialResponse: InitialResponseType) => this._http.post<SecondResponseType>('url', {}, {
                observe: "response",
                headers: {} 
            }))
        });
}

一旦您订阅了depost()方法2,请求就会随之执行。

如果使用HttpClientModule,则方法看起来更简单。实际上,HttpClientModule是HttpModule的包装器

dopost(): Observable<SecondResponseType>  {
    return this._http.get<SecondResponseType>('dammyUrl').pipe(
        switchMap((initialResponse: InitialResponseType) => this._http.post<SecondResponseType>('url'))
    });
}

答案 1 :(得分:0)

据我了解,在这种情况下您需要flatMap RxJS operator。请参见下面的示例:

dopost() {
      return this._http.get(dammyUrl, body, {
         observe: "response",
         headers: headers 
       }).pipe(flatMap(responce=>{
         return this._http.post(url, body, {
            observe: "response",
            headers: headers 
          });
       }));
}

并且您必须订阅问题中所述的dopost方法。