⬅️ Back to Table of Contents
📄 index.ts
📊 Analysis Summary
Metric |
Count |
🔧 Functions |
12 |
📦 Imports |
9 |
📊 Variables & Constants |
3 |
⚡ Async/Await Patterns |
2 |
📐 Interfaces |
2 |
📑 Type Aliases |
1 |
📚 Table of Contents
🛠️ File Location:
📂 packages/core/createTemplatePromise/index.ts
📦 Imports
Name |
Source |
DefineComponent |
vue |
Ref |
vue |
TransitionGroupProps |
vue |
deepRef |
vue |
defineComponent |
vue |
Fragment |
vue |
h |
vue |
shallowReactive |
vue |
TransitionGroup |
vue |
Variables & Constants
Name |
Type |
Kind |
Value |
Exported |
index |
number |
let/var |
0 |
✗ |
instances |
Ref<TemplatePromiseProps<Return, Args>[]> |
const |
deepRef([]) as Ref<TemplatePromiseProps<Return, Args>[]> |
✗ |
props |
TemplatePromiseProps<Return, Args> |
const |
`shallowReactive({ |
|
key: index++, |
|
|
|
|
args, |
|
|
|
|
promise: undefined, |
|
|
|
|
resolve: () => {}, |
|
|
|
|
reject: () => {}, |
|
|
|
|
isResolving: false, |
|
|
|
|
options, |
|
|
|
|
}) as TemplatePromiseProps` |
✗ |
|
|
|
Async/Await Patterns
Type |
Function |
Await Expressions |
Promise Chains |
promise-chain |
createTemplatePromise |
none |
new Promise((_resolve, _reject) => { |
props.resolve = (v) => { |
|
|
|
props.isResolving = true |
|
|
|
return _resolve(v) |
|
|
|
} |
|
|
|
props.reject = _reject |
|
|
|
}).finally, new Promise(...) |
|
|
|
promise-chain |
create |
none |
new Promise((_resolve, _reject) => { |
props.resolve = (v) => { |
|
|
|
props.isResolving = true |
|
|
|
return _resolve(v) |
|
|
|
} |
|
|
|
props.reject = _reject |
|
|
|
}).finally, new Promise(...) |
|
|
|
Functions
createTemplatePromise(options: TemplatePromiseOptions): TemplatePromise<Return, Args>
Code
export function createTemplatePromise<Return, Args extends any[] = []>(
options: TemplatePromiseOptions = {},
): TemplatePromise<Return, Args> {
let index = 0
const instances = deepRef([]) as Ref<TemplatePromiseProps<Return, Args>[]>
function create(...args: Args) {
const props = shallowReactive({
key: index++,
args,
promise: undefined,
resolve: () => {},
reject: () => {},
isResolving: false,
options,
}) as TemplatePromiseProps<Return, Args>
instances.value.push(props)
props.promise = new Promise<Return>((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true
return _resolve(v)
}
props.reject = _reject
})
.finally(() => {
props.promise = undefined
const index = instances.value.indexOf(props)
if (index !== -1)
instances.value.splice(index, 1)
})
return props.promise
}
function start(...args: Args) {
if (options.singleton && instances.value.length > 0)
return instances.value[0].promise
return create(...args)
}
const component = defineComponent((_, { slots }) => {
const renderList = () => instances.value.map(props => h(Fragment, { key: props.key }, slots.default?.(props)))
if (options.transition)
return () => h(TransitionGroup, options.transition, renderList)
return renderList
})
// @ts-expect-error There's a breaking type change in Vue 3.3 <https://github.com/vuejs/core/pull/7963>
component.start = start
return component as any
}
-
JSDoc:
/**
* Creates a template promise component.
*
* @see https://vueuse.org/createTemplatePromise
*/
-
Parameters:
options: TemplatePromiseOptions
- Return Type:
TemplatePromise<Return, Args>
- Calls:
deepRef (from vue)
shallowReactive (from vue)
instances.value.push
new Promise<Return>((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true
return _resolve(v)
}
props.reject = _reject
})
.finally
_resolve
instances.value.indexOf
instances.value.splice
create
defineComponent (from vue)
instances.value.map
h (from vue)
slots.default
- Internal Comments:
// @ts-expect-error There's a breaking type change in Vue 3.3 <https://github.com/vuejs/core/pull/7963> (x4)
create(args: Args): Promise<Return>
Code
function create(...args: Args) {
const props = shallowReactive({
key: index++,
args,
promise: undefined,
resolve: () => {},
reject: () => {},
isResolving: false,
options,
}) as TemplatePromiseProps<Return, Args>
instances.value.push(props)
props.promise = new Promise<Return>((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true
return _resolve(v)
}
props.reject = _reject
})
.finally(() => {
props.promise = undefined
const index = instances.value.indexOf(props)
if (index !== -1)
instances.value.splice(index, 1)
})
return props.promise
}
- Parameters:
args: Args
- Return Type:
Promise<Return>
- Calls:
shallowReactive (from vue)
instances.value.push
new Promise<Return>((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true
return _resolve(v)
}
props.reject = _reject
})
.finally
_resolve
instances.value.indexOf
instances.value.splice
resolve(): void
Code
reject(): void
Code
resolve(): void
Code
reject(): void
Code
resolve(): void
Code
reject(): void
Code
resolve(): void
Code
reject(): void
Code
start(args: Args): any
Code
function start(...args: Args) {
if (options.singleton && instances.value.length > 0)
return instances.value[0].promise
return create(...args)
}
- Parameters:
args: Args
- Return Type:
any
- Calls:
create
renderList(): any
Code
() => instances.value.map(props => h(Fragment, { key: props.key }, slots.default?.(props)))
- Return Type:
any
- Calls:
instances.value.map
Interfaces
TemplatePromiseProps<Return, Args extends any[] = []>
Interface Code
export interface TemplatePromiseProps<Return, Args extends any[] = []> {
/**
* The promise instance.
*/
promise: Promise<Return> | undefined
/**
* Resolve the promise.
*/
resolve: (v: Return | Promise<Return>) => void
/**
* Reject the promise.
*/
reject: (v: any) => void
/**
* Arguments passed to TemplatePromise.start()
*/
args: Args
/**
* Indicates if the promise is resolving.
* When passing another promise to `resolve`, this will be set to `true` until the promise is resolved.
*/
isResolving: boolean
/**
* Options passed to createTemplatePromise()
*/
options: TemplatePromiseOptions
/**
* Unique key for list rendering.
*/
key: number
}
Properties
Name |
Type |
Optional |
Description |
promise |
Promise<Return> | undefined |
✗ |
|
resolve |
(v: Return | Promise<Return>) => void |
✗ |
|
reject |
(v: any) => void |
✗ |
|
args |
Args |
✗ |
|
isResolving |
boolean |
✗ |
|
options |
TemplatePromiseOptions |
✗ |
|
key |
number |
✗ |
|
TemplatePromiseOptions
Interface Code
export interface TemplatePromiseOptions {
/**
* Determines if the promise can be called only once at a time.
*
* @default false
*/
singleton?: boolean
/**
* Transition props for the promise.
*/
transition?: TransitionGroupProps
}
Properties
Name |
Type |
Optional |
Description |
singleton |
boolean |
✓ |
|
transition |
TransitionGroupProps |
✓ |
|
Type Aliases
TemplatePromise<Return, Args extends any[] = [] extends any[] = []>
type TemplatePromise<Return, Args extends any[] = [] extends any[] = []> = DefineComponent<object> & {
new(): {
$slots: {
default: (_: TemplatePromiseProps<Return, Args>) => any
}
}
} & {
start: (...args: Args) => Promise<Return>
};