0

我正在使用React Starter Kit创建我的第一个 React 应用程序,但我正在为 Ajax 调用而苦苦挣扎。我看到这个 Kit 嵌入了一种执行 Ajax 调用的方法(这是在内部用于应用程序路由的方式):

import fetch from '../../core/fetch';

我已经在我的组件中添加了这个,然后在组件加载时尝试执行 Ajax 调用。这是我的代码:

  componentDidMount() {

      var moduleManager = 'https://my_domain.com/my_endpoint';

      async function getModules (url) {
          const response = await fetch(url);
          const content = await response.json();
          return content;
      };

      this.state.modulesList = getModules(moduleManager);

      console.log(this.state.modulesList);
  }

我还在我的渲染函数中使用状态值:

  render() {
    var rows = [];
    for (var i = 0; i < this.state.modulesList.length; i++) {
        rows.push(
            <li>{this.state.modulesList[i]}<li/>
        );
    }

这段代码放在一起记录在我的控制台中:

Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

然后执行 Ajax 调用(成功),我的控制台现在显示:

Promise
__proto__:Promise
[[PromiseStatus]]:"resolved"
[[PromiseValue]]:Array[16]

期望的行为当然是更新我的视图:执行 ajax 调用时,每个数组成员显示一行。

我错过了什么?

谢谢

4

2 回答 2

1

我建议做什么:

constructor() {
  ...
  // Bind your async function to your stateful component's class
  this.getModules = this.getModules.bind(this);
}

async getModules(url) {
  try {
    // Perform the ajax call
    const response = await fetch(url);

    // Convert respone to json
    const content = await response.json();

    // Process your content (if needed)
    ...

    // Call setState() here
    this.setState({someContent: content});

  } catch(e) {
    console.error(e);
  }
}

componentDidMount() {
  this.getModules(`${URL}`);
}

您实际上无法从async函数返回获取/解析的数据。根据此 MDN 链接async函数返回 a promise,而不是您在解析后期望获得的实际数据。

在您的情况下发生的事情是,您实际上是在尝试从async常规(同步)函数(componentDidMount)内部的函数接收返回值。您可以按照我的建议进行操作,也可以在实际功能中解析和解析承诺后.then()使用。setStatecomponentDidMount

我建议在继续之前阅读有关async函数的内容。Promise

祝你好运!

于 2016-11-22T10:31:47.810 回答
0

如果不测试您的代码,一个问题是您错误地直接修改state. 这不会触发 a render,因此您的视图不会更新。setState()改为尝试,如下所示:

<li>{this.setState({modulesList[i]})}<li/>
于 2016-11-22T10:24:18.753 回答