【问题标题】:async/await not working in reactjs (used npx create-react-app) [duplicate]异步/等待在 reactjs 中不起作用(使用 npx create-react-app)[重复]
【发布时间】:2019-01-09 08:13:09
【问题描述】:

目前,makeQuery() 中的console.log() 正在返回正确的对象,而scoop() 中的console.log() 正在返回“未定义”,因为scoop()response 的定义没有等待函数调用到makeQuery()返回。

我希望scoop() 中的response 的定义在下面的代码运行之前等待对makeQuery() 的函数调用。

我该如何做到这一点?

var request = require('request');

const makeQuery = (query) => {
  request('http://0.0.0.0:4000/wikiweb?text=' + query, function (error, response, body) {
      var jason = JSON.parse(body)
      console.log(jason)
      return jason
    }
  )

class Wiki extends React.Component {



  constructor (props) {
    super(props)
    this.scoop = this.scoop.bind(this);
    this.state = {loaded: false}
  }

  scoop = async (e) => {
    e.preventDefault();
    var query = this.textInput.value;
    var response = await makeQuery(query);
    console.log(response)
    // await this.setState({data : response, loaded : true});
    // console.log(this.state.data)
  } 

...

【问题讨论】:

  • 你没有从makeQuery返回任何东西,并且返回值undefined

标签: javascript reactjs async-await


【解决方案1】:

在您当前的代码中,问题是 makeQuery() 正在请求 URL,但没有等待来自 URL 的响应。你需要让 makeQuery() 也成为一个 async/await 函数。

var request = require('request');

const makeQuery = async (query) => {
  return new Promise((resolve, reject) => {
    request("http://0.0.0.0:4000/wikiweb?text=" + query, function (error,response,body) {

      if (error) {
        reject(error);
      }
      var json = JSON.parse(body);
      console.log(json);
      resolve(json);
    });
  })
}

class Wiki extends React.Component {



  constructor(props) {
    super(props)
    this.scoop = this.scoop.bind(this);
    this.state = { loaded: false }
  }

  scoop = async (e) => {
    e.preventDefault();
    var query = this.textInput.value;
    var response = await makeQuery(query);
    console.log(response)
    // await this.setState({data : response, loaded : true});
    // console.log(this.state.data)
  }
}

【讨论】:

  • request 不返回承诺,因此await request('http://0.0.0.0:4000/wikiweb?text=' + query); 不会按预期工作。
  • 在这种情况下,从 makeQuery() 返回一个承诺
  • 更新了代码
【解决方案2】:

您必须从makeQuery 函数返回一个promise,否则将没有使用await 的promise,它会立即解决。

示例

const makeQuery = query => {
  return new Promise(resolve => {
    request("http://0.0.0.0:4000/wikiweb?text=" + query, function(
      error,
      response,
      body
    ) {
      var json = JSON.parse(body);
      console.log(json);
      resolve(json);
    });
  });
};

class Wiki extends React.Component {
  constructor(props) {
    super(props);
    this.scoop = this.scoop.bind(this);
    this.state = { loaded: false };
  }

  scoop = async e => {
    e.preventDefault();
    var query = this.textInput.value;
    var response = await makeQuery(query);
    console.log(response);
  };

  // ...
}

【讨论】:

  • 这会导致请求返回,而不是请求的正文。
  • @TadeoYelos 这不是真的。我正在通过回复解决承诺,resolve(json);
  • 是的,实际上你是对的。非常感谢您的帮助!
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2021-09-11
相关资源
最近更新 更多