簡體   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