【问题标题】:Fetch console showing value but cant save it to a variable获取显示值但无法将其保存到变量的控制台
【发布时间】:2020-05-18 16:43:51
【问题描述】:

这就是我所拥有的。

var a;

handleSubmit(event) {
  var a ;
  event.preventDefault();
this.setState({username:'poop'})
console.log("submit");
  fetch('http://localhost:8080/login/'+this.state.username+'/'+this.state.password,{
    method: 'GET',


  }).then((resp)=> resp.text())
  .then(resp => {
console.log(resp) 
a = resp;

 });

console.log(a);

我的问题是 console.log(resp) 将记录我需要的正确值(“成功”),但是当我尝试执行 var a = resp 时,它显示为未定义。我的 api 返回 1 个字符串,成功或失败。日志将显示成功,但由于某种原因,我无法将其分配给变量。

【问题讨论】:

  • 该代码不完整。您在哪里分配“a”以及在哪里检查未定义的值?
  • @AlanGrosz 刚刚修复它以提高清晰度
  • 好的。 @Shubham Khatri 已经回答了。问题是异步请求。如果你在 http 调用之后设置了一个 console.log,它将是未定义的。您必须在 then 中执行此操作或使用 await
  • @AlanGrosz 使用 await 的目的是什么?我看过很多次,但从未真正理解它的重要性。

标签: javascript reactjs api fetch


【解决方案1】:

您正在handleSubmit 内发出异步请求,因此您不会以尝试访问它的方式在获取请求后立即获得结果,您可以使用setState 将结果存储在状态中并访问它在其他地方this.state.data

handleSubmit(event) {

    event.preventDefault();
    this.setState({username:'poop'})
    console.log("submit");
      fetch('http://localhost:8080/login/'+this.state.username+'/'+this.state.password,{
        method: 'GET',
      }).then((resp)=> resp.text())
      .then(resp => {
          console.log(resp) 
          this.setState({data: resp});
      });
}

或者你可以使用async-awaitlike

async handleSubmit(event) {

    event.preventDefault();
    this.setState({username:'poop'})
    console.log("submit");
      const a = await fetch('http://localhost:8080/login/'+this.state.username+'/'+this.state.password,{
        method: 'GET',
      }).then((resp)=> resp.text())
     console.log(a);
}

【讨论】:

  • 第二种方法奏效了!你能解释一下为什么我必须那样做吗?第一种方法仍然给了我一个空白的回应。由于某种原因,该州没有保存任何内容。
  • setState 是异步的,因此您不会立即看到更新的值,您可以使用 this.setState({data: resp}, () => {console.log(this.state.data)}); 查看更新的状态。此外,async-await 是 javascript 为 Promise 提供的语法,代码在继续之前等待结果。查看文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 太棒了,当你说 setState 不是即时的时,我以为是。当我们在 react 中更改某物的状态时,更改会立即在屏幕上发生。例如,如果我有一个 this.state.demo 并且我对其进行了设置设置状态,我会立即看到更改。
  • 它们会立即发生,但需要额外渲染以反映更改,在编写 this.setState() 后,您不会立即在同一函数中看到更新
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多