Angular-在Http.post中接收并返回Observable <t>响应

时间:2019-01-09 12:37:44

标签: angular typescript rxjs observable rxjs6

我实现了一个返回Observable的方法。在此方法内部,我使用http.post向后端发送请求。接收到响应(它是一个JSON对象)后,我要将其存储在Observable变量中并返回该变量。但是我不知怎么解决了那个问题。在.subscribe中,res变量没有存储在postResponse变量中,但是我可以在“本地” console.log中看到res变量具有正确的值。全局console.log为空。此外,我得到了错误:

  

“ TS2322:   不能将'ArqResponse'类型分配给'Observable'类型”   退货错误。

我的代码如下:

postARQRequest(request): Observable<ArqResponse>{
    let postResponse = new ArqResponse;
    const result = this.http.post<ArqResponse>(this.arqUrl, request)
                       .subscribe((res: ArqResponse) => { postResponse = res; console.log('shadow: ' + res)});
    console.log('global: ' + JSON.stringify(postResponse));
    return postResponse;
}

我的问题是:

  1. 如何将响应正文存储在变量中,然后可以 被退回?
  2. 如何将ArqResponse变量“投射”到 可观察的变量?
  3. .subscribe似乎是错误的,因为我得到了:
  

this.arqService.postARQRequest(...)。subscribe不是函数       错误

3 个答案:

答案 0 :(得分:3)

我猜这就是您想要的:

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request);
}

这里不需要订阅任何内容。鉴于this.http.post返回了您想要的类型,只需返回它即可。

如果您真的想将响应存储在本地变量中,则可以通过以下几种方法来实现:

请改用诺言以获得结果。稍后使用of使它可见:

async postARQRequest(request): Observable<ArqResponse>{
    let postResponse = new ArqResponse;
    postResponse = await this.http.post<ArqResponse>(this.arqUrl, request).toPromise();

    return of(postResponse);
}

使用tap运算符对响应做出反应,但不对其进行突变

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request).pipe(
        tap((res) => ...) // do stuff with res here, but it won't be mutated
    );
}

使用map运算符将响应映射到其他内容

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request).pipe(
        map((res) => ...) // do stuff with res here, but it *will map to whatever you return from this handler*
   );
}

答案 1 :(得分:0)

Y方法http.post已经返回了Observable,因此您可以直接执行以下操作:

postARQRequest(request): Observable<ArqResponse>{
    return this.http.post<ArqResponse>(this.arqUrl, request);
}

,然后订阅它:this.arqService.postARQRequest(...).subscribe()

如果要将对象转换为Observable,可以使用 Rxjs6 中的of

import { of } from 'rxjs';

// ...

// create an Observable from a value:
of(someObject);

答案 2 :(得分:0)

我认为这可能对您有帮助

postARQRequest(): Observable<ArqResponse[]> {
 return this.http.post(this.arqUrl, request)
 .map(this.extractData()) <== passing result of function
 .catch(this.handleError()); <== passing result of function
}

在此处处理响应和错误

private extractData(res: Response) {
   let body = res.json(); 
   return body.data || { }; 
}

private handleError (error: any) {
    let errMsg = error.message || 'Server error';
    console.error(errMsg); 
    return Observable.throw(errMsg);
}