反应useEffect异步警告?

时间:2020-03-08 15:20:22

标签: javascript reactjs debugging asynchronous react-hooks

我正试图摆脱React的警告“看起来您写了useEffect(async()=> ...)或返回了Promise。而是在您的效果内编写异步函数并立即调用它”。

我一直在引用这篇文章https://www.robinwieruch.de/react-hooks-fetch-data试图摆脱它,但可惜,我做不到。

我的使用效果:

  useEffect(() => api.getAllPokemon(setResponse),[])

还有我在导入文件中定义的api.getAllPokemon异步函数:

const api = {}

api.getAllPokemon = async (cb) => {
  await fetch('http://localhost:8080/pokemon', {
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }
  })
  .then(async (pokemon) => await pokemon.json())
  .then((pokemon) => pokemon.rows.map(({ name }) => name))
  .then(pokemon => cb(pokemon))
};

export default api;

3 个答案:

答案 0 :(得分:1)

useEffect只能返回清除功能,否则什么也不会返回。在您的情况下,请在箭头函数中添加方括号,或使用常规函数语法避免返回Promise:

useEffect(() => {
  api.getAllPokemon(setResponse)
}, [])

useEffect(function () { 
  api.getAllPokemon(setResponse) 
}, [])

答案 1 :(得分:1)

你不能结合等待和承诺

和useEffect中的异步功能也有所不同。

当您异步进行提取时,则不起作用,但会为您返回响应

所以我们需要编写try and catch

useEffect(() => {
    try {
      const fetchData = async () => {
        const res = await fetch("http://localhost:8080/pokemon");
        setBaseExperience(res);
      };

      fetchData();
    } catch (err) {
      console.log(err);
    }
  }, []);

答案 2 :(得分:0)

使用提取包装器 (Live Demo) 的 JSON 提取示例

import React, { useState } from "react";
import { useAsyncEffect } from "use-async-effect2";
import cpFetch from "cp-fetch"; //cancellable c-promise fetch wrapper

export default function TestComponent(props) {
  const [text, setText] = useState("");

  useAsyncEffect(
    function* () {
      setText("fetching...");
      const response = yield cpFetch(props.url);
      const json = yield response.json();
      setText(`Success: ${JSON.stringify(json)}`);
    },
    [props.url]
  );

  return <div>{text}</div>;
}

根据您的代码:

const api = {}

api.getAllPokemon = function*() => {
  const respose= yield cpFetch('http://localhost:8080/pokemon', {
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }
  });

  const pokemon= yield response.json();
  return pokemon.rows.map(({ name }) => name));
};

export default API;

功能组件主体内部:

useAsyncEffect(function*(){
   const names= yield* api.getAllPokemon(setResponse);
   // changeState here
},[])