繁体   English   中英

异步函数内的回调异步函数! 是正确的?

[英]Callback Async function inside async function ! Is correct?

我希望这个重用异步函数用在很多地方!

const requestGetData = (callback?: Function): void => {
      (async (): Promise<void> => {
        try {
          if (callback) {
            await callback();
          }
          const data = await getDataApi();
          setData(data);
        } catch (error) {
          console.log(error)
        }
      })();
  };

我有不同的异步功能:

  const requestUpdateData = async (): Promise<void> => {
      await postUpdate();
      setCountUpdate(count+1);
    };

我将使用:

...
const handleUpdate=()=>{
  requestGetData(requestUpdateData);
}

useEffect(()=>{
  requestGetData()
},[])

我自定义 async 是否正确? 有没有更好的办法 ? 我想重用函数 requestGetData

考虑到调用该函数时,您使用await调用它,这意味着您始终希望回调函数是异步的。 我建议将回调参数的类型声明更新为() => Promise<any>并且我不明白为什么这需要是 IIFE。 否则,对我来说看起来不错。

无需将其包装在 IIFE 中,也无需注意 TS 可以自动推断出的函数类型。 此外,最好使用更具体的类型,例如() => void ,而不是Function

考虑如下:

const requestGetData = async (callback?: () => void) => {
    try {
        if (callback) {
            await callback();
        }
        setData(await getDataApi());
    } catch (error) {
        console.log(error);
    }
};

另一种选择是完全删除回调,并让调用者链一个.thenrequestUpdateData调用上:

const requestGetData = () => {
    return getDataApi().then(setData);
};
requestUpdateData()
    .then(requestGetData)
    .catch((error) => {
        console.log(error);
    });

上面, requestGetData返回它的 Promise 链而不进行捕获,但是如果应用程序中的其他任何内容在遇到错误时不需要特殊逻辑,则您可以根据需要在其中捕获。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM