异步函数返回[object Promise]而不是实际值

时间:2019-02-26 17:47:05

标签: javascript reactjs

我是ReactJS的新手。

我对异步函数

的返回值有一些疑问

当我打电话

const result = this.getFieldsAPI();

结果值为[object Promise]

我从 console.log(“ result:” + result);

中看到[object Promise]
getFieldsAPI = async() => {
    let currentChromosome = "";
    switch (this.state.chromosome) {
      case "Autosom":
        currentChromosome = "/getlocusautosomalkit/";
        break;
      case "Y_STRs":
        currentChromosome = "/getlocusykit/";
        break;
      case "X_STRs":
        currentChromosome = "/getlocusxkit/";
        break;
      default:
        currentChromosome = "";
    }
    let result = [];
    await Axios.get(API_URL + currentChromosome + this.state.currentKit).then((Response) => {
      Response.data.map((locus) => {
        result.push(locus);
      });
    })
    return "result";
  }

  // To generate mock Form.Item
  getFields() {
    const count = this.state.expand ? 10 : 6;
    const { getFieldDecorator } = this.props.form;
    const children = [];
    const result = this.getFieldsAPI();
    console.log("result : " + result);
    for (let i = 0; i < 10; i++) {
      children.push(
        <Col span={8} key={i} style={{ display: i < count ? 'block' : 'none' }}>
          <Form.Item label={`Field ${i}`}>
            {getFieldDecorator(`field-${i}`, {
              rules: [{
                required: true,
                message: 'Input something!',
              }],
            })(
              <Input placeholder="placeholder" />
            )}
          </Form.Item>
        </Col>
      );
    }
    return children;
  }

3 个答案:

答案 0 :(得分:1)

您不必等待result的值,因此您只会得到未兑现的承诺。如果您更改

const result = this.getFieldsAPI();

const result = await this.getFieldsAPI();

您会得到想要的。您还需要使getFields()异步。

答案 1 :(得分:1)

要获得有效的响应,您应该稍微调整一下代码,因为当前您返回的是字符串“结果”,而不是诺言中的数组。

在您的getFieldsApi方法中,您可以执行以下操作:

...
Response = await Axios.get(API_URL + currentChromosome + this.state.currentKit);
return Response.data.map((locus) => locus);

您会这样称呼它:

const result = await this.getFieldsApi();

答案 2 :(得分:0)

异步函数将始终返回Promise。承诺可能会解决或被拒绝。您可以通过以下方式处理承诺:

  1. 使用then
this.getFieldsAPI.then((value) => {
  // code on success
}, (errorReason) => {
  // code on error
});
  1. 使用await
try { 
  const result = await this.getFieldsAPI();
} catch(errorReason) { 
  // code on error
}

您可以选择最适合自己的。我个人更喜欢选项2,它似乎不太混乱。