Angular 8 Http Post 从订阅中获取布尔值

Angular 8 Http Post get boolean value from subscribe

我试图从布尔值 true/false 的 subscribe 中获取价值,但我无法获取价值,这是我目前使用的。

我的 http 旧方法 post.

this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
.subscribe(data => this.Success(data), err => this.Error(err)); 

this.Success(data)this.Error(err) 是现在正在调用的方法,我尝试获取数据的新方法是这样的。

const fData = new FormData();
fData.append('Id', Id.toString());    
fData.append('IsActive', IsActive.toString());
const test = this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
  .subscribe(data => {
    this.Success(data);
    this.Switch = IsActive;
    return this.Switch;
  },
    err => {
      this.Error(err);
      this.Switch = !IsActive;
      return this.Switch;
    });
    console.log(test);//Subscriber {closed: false, _parentOrParents: null, _subscriptions: Array(1), syncErrorValue: null, syncErrorThrown: false, …}
    console.log(this.Switch);//undefined at first then gives opposite result like true gives false and vice versa

作为this.Switch = IsActive; 布尔值从中取出数据 returns undefined 先是 returns value false 而不是 true,反之亦然。

因为我知道你的问题是因为异步的东西,所以我要在这里写一个解释。简单来说,你不知道异步操作什么时候结束。例如,当您执行 http 功能时,您正在与服务器通信,因此您不知道服务器何时会应答(因为连接速度慢、流量大,或者可能是因为您要求进行繁重的操作)。

为了解决这个问题,我们使用了使用观察者模式的 subscribe() 方法。所以,这里的重点是,因为您不知道服务器或操作(如线程)何时会完成您订阅它并继续观察任何更改或答案。当您收到它时,订阅内的代码就会执行。

您可以在此处了解有关观察者模式的更多信息:https://en.wikipedia.org/wiki/Observer_pattern#:~:text=The%20observer%20pattern%20is%20a,calling%20one%20of%20their%20methods。 和这里的异步理论:https://en.wikipedia.org/wiki/Asynchrony_(computer_programming)

对于您的问题,您可以将值初始化为 false,并将复选框值设置为 [(ngModel)]="Switch",这样当 switch var 更新时,复选框也会更新!

由于它是 可观察的,您不会立即得到响应。所以控制台日志 this.Switch 在成功和错误块中。试试下面的代码片段

const fData = new FormData();
fData.append('Id', Id.toString());    
fData.append('IsActive', IsActive.toString());
const test = this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
  .subscribe(data => {
    this.Success(data);
    this.Switch = IsActive;
    console.log("Success", this.Switch);
    return this.Switch;
  },
    err => {
      this.Error(err);
      this.Switch = !IsActive;
      console.log("Error", this.Switch);
      return this.Switch;
    });

我不确定这是否会解决您的问题,但肯定会有助于调试以获得您的解决方案。

注意:你得到undefined at first then gives opposite result like true gives false and vice versa的原因是你在成功或错误块之外安慰this.Switch,这主要是return 未定义第一个值和下一个 pre-assigned 值。因为 this.Switch 是全局范围变量。

使用 asyncawait 得到结果并且有效。

const test = await this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`, fData)
                 .toPromise().then((data)=>{
                  this.Switch = IsActive;
                  return this.Switch;
                 }).catch((error)=>{
                  this.Switch = !IsActive;
                  return this.Switch;
                 });
    console.log(test); //Same result as below
    console.log(this.Switch); //Same result as above