为什么我不能在 Angular 中映射来自 http 请求的布尔响应?
Why can't I map a boolean response from http request in Angular?
我在我的 WebAPI 中从 Angular 调用一个 .Net 方法,它发送一个布尔值来关闭某些东西,并 returns 一个具有当前状态的布尔值。但是,当尝试映射 Angular 中的响应时,它返回未定义。 (.Net 6, Angular 13)
.网络控制器:
[HttpPost("/api/Gpio/DisableOutputs")]
public Task<bool> DisableOutputs([FromBody] bool disableOutputs)
{
var isDisabled = this._gpioService.DisableOutputs(disableOutputs);
Console.WriteLine(isDisabled);
return Task.FromResult(isDisabled);
}
在 Chrome 的开发工具中,我看到了响应,但是我无法将其映射回我的 Angular 应用程序。
Angular 服务:
disableOutputs(disableOutputs: boolean): Observable<boolean> {
return from(
this.authService.getAccessToken()
.then(token => {
const headers = new HttpHeaders().set("Authorization", `Bearer ${token}`);
this.http.post(this.createCompleteRoute("api/Gpio/DisableOutputs", this.envUrl.urlAddress),
disableOutputs,
{ headers: headers, withCredentials: true }).toPromise();
})).pipe(map((s: any) => {
// 's' is 'undefined'
return s as boolean;
}));
}
Angular 分量:
disableOutputs() {
this.service.disableOutputs(!this.outputsDisabled).subscribe(d => {
this.outputsDisabled = d;
console.log(d);
// 'd' is 'undefined'
});
}
您得到 undefined
因为您没有返回嵌套的 http 承诺。
但是您可以使用 high-order 映射运算符(例如 concatMap
、switchMap
、...
来大大简化您的实现
应该是这样的。
return from(this.authService.getAccessToken()).pipe(
concatMap(token => {
const headers = new HttpHeaders().set("Authorization", `Bearer ${token}`);
return this.http.post<boolean>(
this.createCompleteRoute("api/Gpio/DisableOutputs", this.envUrl.urlAddress),
disableOutputs,
{ headers: headers, withCredentials: true }
);
})
干杯
我在我的 WebAPI 中从 Angular 调用一个 .Net 方法,它发送一个布尔值来关闭某些东西,并 returns 一个具有当前状态的布尔值。但是,当尝试映射 Angular 中的响应时,它返回未定义。 (.Net 6, Angular 13)
.网络控制器:
[HttpPost("/api/Gpio/DisableOutputs")]
public Task<bool> DisableOutputs([FromBody] bool disableOutputs)
{
var isDisabled = this._gpioService.DisableOutputs(disableOutputs);
Console.WriteLine(isDisabled);
return Task.FromResult(isDisabled);
}
在 Chrome 的开发工具中,我看到了响应,但是我无法将其映射回我的 Angular 应用程序。
Angular 服务:
disableOutputs(disableOutputs: boolean): Observable<boolean> {
return from(
this.authService.getAccessToken()
.then(token => {
const headers = new HttpHeaders().set("Authorization", `Bearer ${token}`);
this.http.post(this.createCompleteRoute("api/Gpio/DisableOutputs", this.envUrl.urlAddress),
disableOutputs,
{ headers: headers, withCredentials: true }).toPromise();
})).pipe(map((s: any) => {
// 's' is 'undefined'
return s as boolean;
}));
}
Angular 分量:
disableOutputs() {
this.service.disableOutputs(!this.outputsDisabled).subscribe(d => {
this.outputsDisabled = d;
console.log(d);
// 'd' is 'undefined'
});
}
您得到 undefined
因为您没有返回嵌套的 http 承诺。
但是您可以使用 high-order 映射运算符(例如 concatMap
、switchMap
、...
应该是这样的。
return from(this.authService.getAccessToken()).pipe(
concatMap(token => {
const headers = new HttpHeaders().set("Authorization", `Bearer ${token}`);
return this.http.post<boolean>(
this.createCompleteRoute("api/Gpio/DisableOutputs", this.envUrl.urlAddress),
disableOutputs,
{ headers: headers, withCredentials: true }
);
})
干杯