Files
SnowLuma/.pnpm-store/v11/files/11/0250717fd88be5df5688d659e81295ba6fc356f228a8e3e117fe7ec9766987e1b4ae4e06148a69b4e5ce419f32da9bc1e7a329d14a0bb2b3faece1a882c386
TanTan 2a69b23b47
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

56 lines
1.4 KiB
Plaintext

import * as React from 'react'
import { TSR_DEFERRED_PROMISE, defer } from '@tanstack/router-core'
import { reactUse } from './utils'
export type AwaitOptions<T> = {
promise: Promise<T>
}
/** Suspend until a deferred promise resolves or rejects and return its data. */
export function useAwaited<T>({ promise: _promise }: AwaitOptions<T>): T {
if (reactUse) {
const data = reactUse(_promise)
return data
}
const promise = defer(_promise)
if (promise[TSR_DEFERRED_PROMISE].status === 'pending') {
throw promise
}
if (promise[TSR_DEFERRED_PROMISE].status === 'error') {
throw promise[TSR_DEFERRED_PROMISE].error
}
return promise[TSR_DEFERRED_PROMISE].data
}
/**
* Component that suspends on a deferred promise and renders its child with
* the resolved value. Optionally provides a Suspense fallback.
*/
export function Await<T>(
props: AwaitOptions<T> & {
fallback?: React.ReactNode
children: (result: T) => React.ReactNode
},
) {
const inner = <AwaitInner {...props} />
if (props.fallback) {
return <React.Suspense fallback={props.fallback}>{inner}</React.Suspense>
}
return inner
}
function AwaitInner<T>(
props: AwaitOptions<T> & {
fallback?: React.ReactNode
children: (result: T) => React.ReactNode
},
): React.JSX.Element {
const data = useAwaited(props)
return props.children(data) as React.JSX.Element
}