Angular HTTP Post - 无法访问返回值[重复]

Posted

技术标签:

【中文标题】Angular HTTP Post - 无法访问返回值[重复]【英文标题】:Angular HTTP Post - Unable to access returned value [duplicate] 【发布时间】:2020-04-29 16:18:51 【问题描述】:

对于我的项目,我正在制作一个 Angular 前端,其中将发出大量 HTTP POST 请求,数据被传递到后端,然后后端返回数据作为确认。我已经完成了第一部分的工作,后端接收数据,但是一旦我尝试访问返回的数据,我就会不断发现我将数据传递给的变量正在返回“未定义”。我已经使用 Postman 来确认后端正在正确接收和返回数据,因此前端可能是罪魁祸首。我的代码如下:

方法一:

 onSubmitP1()
  
    const formData = new FormData();
    formData.append('data_selection', this.SearchDataForm.get('dataselection').value);

    console.dir(this.SearchDataForm.get('dataselection').value);

    let headerOptions = new HttpHeaders();
    headerOptions.append('Content-Type', 'application/text; charset=UTF-8');

    return this.httpClient.post(this.SERVER_URL, formData, headers: headerOptions);
  

方法二:

onSubmitP2()
  
    this.onSubmitP1().subscribe((data) => this.result = data);

    console.log(this.result);
    console.dir(this.result);
  

当我的 html 提交按钮被按下时首先调用方法 2,然后调用方法 1,它实际上发出 POST 请求并返回可观察值。我希望将我的 Web 服务返回的数据分配给“结果”,以便我可以查看它,但它一直返回“未定义”。

【问题讨论】:

【参考方案1】:

您的 onSubmitP2() 订阅了 onSubmitP1() 方法,因此您在异步调用结束时设置 this.result = data (基本上在 Http 请求结束时),但您正在写入立即控制台。 更改您的订阅:

onSubmitP2()
  
    this.onSubmitP1().subscribe((data) =>  

       this.result = data;

       console.log(this.result);
       console.dir(this.result);

    );
  

【讨论】:

【参考方案2】:

以这种方式尝试相同的方法

onSubmitP2()
  
    this.onSubmitP1().subscribe((data) => 
     this.result = data

     console.log(this.result);
     console.dir(this.result);
    );

  

我将 console.logs 放入结果到达后调用的回调中。在您的版本日志中,在调用刚启动后调用,未完成。这是因为异步 JS 概念而发生的

【讨论】:

【参考方案3】:

这里的问题在于了解异步代码的工作原理,尤其是在 JS/TS 中。您的 console 行在返回任何内容之前运行,因为订阅尚未产生任何内容。我强烈建议查看异步代码在 Web 开发中的工作原理,但这里有一个临时解决方案:

this.onSubmitP1().subscribe((data) => 
  this.result = data;
  // handle result stuff here
);

【讨论】:

【参考方案4】:

您无法访问,因为它是异步调用。就像知道未来;) 在服务器准备好结果后,将调用订阅的函数。而且由于它是异步调用,因此您编写的代码将在之前发生,然后函数将结束。

【讨论】:

以上是关于Angular HTTP Post - 无法访问返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Angular.js $http.post TypeError:无法读取未定义的属性“数据”

Ionic 2 / Angular 问题与 http post 到 laravel api

Angular $http.post:无法将带有数据的对象发送到服务器。数据作为字符串起作用,作为对象 - 不是

无法反序列化从 Springboot POST 映射函数上的 Angular http post 请求发送的 POJO

无法在 Node.js res.body 中获取 $http.post 请求数据

使用 Angular.js 的 HTTP POST