【问题标题】:ASYNC call of custom hook in ReactReact 中自定义钩子的异步调用
【发布时间】:2019-04-09 13:35:55
【问题描述】:

async 调用和我在 React 中的自定义钩子有问题。

我需要从同一个自定义钩子中调用一系列 fetch,但它不尊重等待链。

我有一些按钮可以像这样工作onClick

buttonDelete={() => deleteAssignedOpp(opportunity.id)}

async function deleteAssignedOpp(id) {
    await doFetch(`/opportuniy/assigned/${id}`, "DELETE");
    await doFetch("/opportuniy/assigned/list", "GET", "IN_PROGRESS");
  }

这些按钮正在调用自定义钩子,如下所示:

(我从在线教程中获得了一些代码)

function useFetch() {
  const [url, setUrl] = useState("");
  const [obj, setObj] = useState("");
  const [method, setMethod] = useState("GET");
  const [body, setBody] = useState();
  const [state, dispatch] = useStateValue();

  useEffect(() => {
    let didCancel = false;
    if (url) {
      const fetchData = async () => {
        dispatch({
          type: `FETCH_${obj}_INIT`
        });
        try {
          const response = await fetch(
            `https://myapiAddress${url}`,
            {
              method: method,
              //body: body,
              headers: new Headers({
                Authorization: myFunctionForAuthorization
              })
            }
          );
          const result = await response.json();
          if (!didCancel) {
            dispatch({
              type: `FETCH_${obj}_SUCCESS`,
              payload: result
            });
          }
        } catch (error) {
          if (!didCancel) {
            dispatch({
              type: `FETCH_${obj}_ERROR`,
              payload: { error }
            });
          }
        }
      };

      fetchData();

      return () => {
        didCancel = true;
      };
    }
  }, [method, body]);

  const doFetch = (url, method, obj, body = "") => {
    setUrl(url); 
    setObj(obj); 
    setMethod(method);
    setBody(body); 
  };

  return [doFetch];
}

export default useFetch;

我希望自定义挂钩按按钮async/await 函数的相同顺序调用。

非常感谢。

【问题讨论】:

  • DoFetch 不返回承诺,所以你在等待 undefined 并且这不起作用。
  • @Snapstromegon 好的...你能告诉我这样做的代码吗?

标签: javascript reactjs react-hooks


【解决方案1】:

你可以在你的 useEffects hook 中尝试 Promise.all 。每次 fetch 都会返回一个 promise

Promise.all([api1,api2]).then(function(values){
   console.log(values)
});

这样行吗。

【讨论】:

  • 我应该在哪里添加这个 Promise.all?谢谢。
  • 类似 - useEffect(() => { Promise.all([api1,api2]).then(function(values){ // 在这里使用你的数据,例如 setSate 通过 useSate 钩子或分配给一个 useRef 钩子变量 }); });
  • ... api1 和 api2 是什么... 这是一个动态挂钩,我无法理解您这样告诉我的内容。您只是在函数中放入了相同的代码......但这如何与我的代码一起使用?
  • 这些是您在钩子中使用的函数,例如 const api1 = (url) => fetch(url)。我正在努力为您提供帮助,但我不会再为您编写上述代码,我的朋友。
  • 我的钩子中的功能?我只是获取数据并在我的钩子中调度。我希望这种情况一次发生一次。