为什么我不能在 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 映射运算符(例如 concatMapswitchMap、...

来大大简化您的实现

应该是这样的。

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 }
    );
 })

干杯