题目:getAsyncData 的实现

定义「异步数据」的类型如下所示:

  1. type AsyncData<T> = T | (() => T) | (() => Promise<T>)

实现一个 getAsyncData 方法,输入一个异步数据,返回这个异步数据的结果,而非函数。

考察点

判定数据类型,async/await,try-catch,TS 泛型

解答

  1. async function getAsyncData<T>(data: AsyncData<T>): T {
  2. const getData = typeof data === 'function' ? data : () => data
  3. try {
  4. return await getData()
  5. } catch (error) {
  6. return undefined
  7. }
  8. }

补充题目

如何处理 async/await 的异常?

使用 try-catch

如何实现一个 react hook,达成相同的功能?

  1. function useAsyncData<T>(asyncData: AsyncData<T>) {
  2. const [loading, setLoading] = useState(true)
  3. const [result, setResult] = useState<T>(undefined)
  4. const getAsyncData = useCallback(async () => {
  5. const getData =
  6. typeof asyncData === 'function' ? asyncData : () => asyncData
  7. try {
  8. return await getData()
  9. } catch (error) {
  10. return undefined
  11. }
  12. }, [asyncData])
  13. useEffect(() => {
  14. getAsyncData(asyncData).then((result) => {
  15. setResult(result)
  16. setLoading(false)
  17. })
  18. }, [])
  19. return { loading, result }
  20. }