Promise.all返回[[PromiseValue]],但我需要所有返回值组成的数组

时间:2019-09-09 04:28:14

标签: javascript promise async-await

我正在尝试返回json对象的数组,但是下面的代码返回[[PromiseValue]],并且肯定有数据。

“函数结果”

enter image description here

如何获取json对象数组并将其设置为状态

注意:如果我在有效的.then(data => console.log(data))函数内调用getEndResults,但由于其中抛出错误,我无法在其中设置setState

  

警告:setState(...):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState()。这是无人操作。

getUserCredits = async (userId, creditId) => {
    return await fetch(
    `${someLink}/userId/${userId}/credit/${creditId}`,
        {
            method: "GET",
        }
    )
}

getEndResult = async () => {
    const userId = await this.getUserId(userId);
    const userData = await this.getUserData(userId);

    const checkData = await Promise.all(userData.checks.map(check => {
    return check.checkIds.map((checkIds) => {
        return this.getUserCredits(userId ,checkIds)
            .then(res => res.json())
            .then(data => console.log(data))
            // Can't setState here
            // .then(data => this.setState({ results: data }))
        })
    }))

    console.log(checkData);
}

1 个答案:

答案 0 :(得分:3)

您正在创建一个Promise的二维数组,然后将其传递到Promise.all。 Promise.all只知道如何使用一维数组,因此它看到的是一个数组,其中包含了无法承诺的内容。对于非承诺,promise.all会立即解决为其提供的值。

在将二维数组发送到Promise.all之前,您需要对其进行展平。如果您有一个array.prototype.flatmap的polyfill(很快就会添加到javascript中,但还​​没有添加),可以这样进行:

const checkData = await Promise.all(userData.checks.flatMap(check => {
  return check.checkIds.map((checkIds) => {
    return this.getUserCredits(userId, checkIds)
      .then(res => res.json());
  });

如果您无法使用该函数,则可以编写自己的函数来展平2d数组,如下所示:

function flatten(arr) {
  const result = [];
  arr.forEach(val => {
    if (Array.isArray(val)) {
      result.push(...val);
    } else {
      result.push(val);
    }
  });
  return result;
}

// used like:

const promises = flatten(userData.checks.map(check => {
  // ... etc
}));
const checkData = await Promise.all(promises);