MCPcopy
hub / github.com/vuejs/core / defineAsyncComponent

Function defineAsyncComponent

packages/runtime-core/src/apiAsyncComponent.ts:48–268  ·  view source on GitHub ↗
(source: AsyncComponentLoader<T> | AsyncComponentOptions<T>)

Source from the content-addressed store, hash-verified

46
47/*@__NO_SIDE_EFFECTS__*/
48export function defineAsyncComponent<
49 T extends Component = { new (): ComponentPublicInstance },
50>(source: AsyncComponentLoader<T> | AsyncComponentOptions<T>): T {
51 if (isFunction(source)) {
52 source = { loader: source }
53 }
54
55 const {
56 loader,
57 loadingComponent,
58 errorComponent,
59 delay = 200,
60 hydrate: hydrateStrategy,
61 timeout, // undefined = never times out
62 suspensible = true,
63 onError: userOnError,
64 } = source
65
66 let pendingRequest: Promise<ConcreteComponent> | null = null
67 let resolvedComp: ConcreteComponent | undefined
68
69 let retries = 0
70 const retry = () => {
71 retries++
72 pendingRequest = null
73 return load()
74 }
75
76 const load = (): Promise<ConcreteComponent> => {
77 let thisRequest: Promise<ConcreteComponent>
78 return (
79 pendingRequest ||
80 (thisRequest = pendingRequest =
81 loader()
82 .catch(err => {
83 err = err instanceof Error ? err : new Error(String(err))
84 if (userOnError) {
85 return new Promise((resolve, reject) => {
86 const userRetry = () => resolve(retry())
87 const userFail = () => reject(err)
88 userOnError(err, userRetry, userFail, retries + 1)
89 })
90 } else {
91 throw err
92 }
93 })
94 .then((comp: any) => {
95 if (thisRequest !== pendingRequest && pendingRequest) {
96 return pendingRequest
97 }
98 if (__DEV__ && !comp) {
99 warn(
100 `Async component loader resolved to undefined. ` +
101 `If you are using retry(), make sure to return its return value.`,
102 )
103 }
104 // interop module default
105 if (

Calls 2

isFunctionFunction · 0.90
defineComponentFunction · 0.90

Tested by

no test coverage detected