收到 API 呼叫响应后无法在 React 中设置状态

Unable to set state in React after receiving API call response

所以,我正在用 React 构建一个多页面向导组件。
我正在使用功能组件。 父组件保存状态。 每个“步骤”(Step1、Step2 等)页面均由Parent 组件中的switch 语句调用。

我的问题是,在我的第 2 步页面中,我传入了项目的“数组”并从 API 调用接收到“数组”响应,但它无法使用该响应设置状态,因为我打算。

这是父组件的状态:

  const [colorLinks, setColorLinks] = useState({
      red: [],
      blue: [],
      green: [],
      cyan: [],
      black: [],
      white: [],
      purple: [],
      gold: [],
      lightgreen: [],
      magenta: [],
      orange: [],
      gray: [],
      sepia: [],
      copper: [],
      pink: [],
      brown: [],
      beige: [],
  })

这是在 Parent 组件中编写的异步请求的代码,这些代码作为 props 传递给 Step2:

const functionWithPromise = item => { //a function that returns a promise
  return Promise.resolve('ok')
}

const anAsyncFunction = async (item, setColorLinks) => {
        let post = {
          "request": {
            "url": "http://colorendpoints.com/",
            "color": item
          }
        }
        let endpointurl = `http://localhost:8021/&url=http://colorendpoints.com/`;
        let result;
    
        try {
          result = await fetch(endpointurl, {
            method: "POST",
            body: JSON.stringify(post),
            headers: {
              Accept: "application/json",
              "Content-Type": "application/x-www-form-urlencoded"
            }
          })
          console.log('Successfully completed post request!')
          result = await result.json()
          result = result.items[0] // because it arrives as an array with items I need in 0th position
          setColorLinks({
                  red: result.red,
                  blue: result.blue,
                  green: result.green,
                  cyan: result.cyan,
                  black: result.black,
                  white: result.white,
                  purple: result.purple,
                  gold: result.gold,
                  lightgreen: result.lightgreen,
                  magenta: result.magenta,
                  orange: result.orange,
                  gray: result.gray,
                  sepia: result.sepia,
                  copper: result.copper,
                  pink: result.pink,
                  brown: result.brown,
                  beige: result.beige,
          })
          return functionWithPromise(result)
        } catch (e) {
          console.log('Got an error...e')
          console.log()
          return functionWithPromise(e)    
        }
}

const getData = async () => {
  return Promise.all(list.map(item => anAsyncFunction(item)))
}

仍然在 Parent 组件中,然后我将上面的 (getDatacolorLinkssetColorLinks) 传递到 Step2,如下所示:

<Step2 
    getData={getData}
    colorLinks={colorLinks}
    setColorLinks={setColorLinks}
/>

我的列表:['color1', 'color2', 'color1', ...]

尽管执行了上述操作,但我无法colorLinks 更新传入的响应。 我可以清楚地看到控制台中的成功响应,但 setColorLinks 完全忽略 。 我肯定会通过调用 getData 得到结果数组,但即使使用 for 循环,它也认为结果未定义。 我该如何解决这个问题并使用 API 调用的结果更新状态? 为什么 setColorLinks 不更新我的异步地图函数中的状态?

你的问题来自这个函数

const getData = async () => {
  return Promise.all(list.map(item => anAsyncFunction(item)))
}

您正在地图中使用setColorLink,意味着您多次调用setColorLink。但是,setState 是一个异步请求 - 您最终会用新的 setState 覆盖每个状态。

我不确定 list 是什么,这个 .map 是干什么用的。如果您需要遍历项目数组并获取它们。你应该这样做。

const getData = async () => {
  const result = await Promise.all(list.map(item => anAsyncFunction(item)))
  setColorLink(result) //<- set state here, not inside Promise.all
}

您的列表是一个颜色数组,但 colorLink 只是一个颜色对象。 colorLink 是一个颜色对象数组吗?