我实现了一个返回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;
}
我的问题是:
.subscribe
似乎是错误的,因为我得到了:this.arqService.postARQRequest(...)。subscribe不是函数 错误
答案 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);
}